利用opencv进行圆形标志提取和质心计算

最近跟着老师做项目,需要对图片中拍摄的圆形标志点进行检测和提取,查了一些资料和博客,记录一下过程。实际拍摄的图片如图所示:

图片处理过程的大概思路是:
1、进行双边滤波处理(可以较好的保留圆形标志的边缘信息)

CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d,double sigmaColor, double sigmaSpace,int borderType = BORDER_DEFAULT );


2、利用Mean shift区域分割算法分割圆形标志(分割次数可以根据图片具体情况而定)

CV_EXPORTS_W void pyrMeanShiftFiltering( InputArray src, OutputArray dst,double sp, double sr, int maxLevel = 1,TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5,1) );


double sp—滑动空间的窗口半径
double sr—颜色窗口半径
termcrit:迭代算法终止条件(可以选择迭代次数或者迭代精度作为终止条件)

3、将分割出圆形标志进行Canny算子边缘检测

4、利用findContours函数获取轮廓信息并填充区域轮廓内部
findContours函数的定义:

CV_EXPORTS_W void findContours( InputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode,int method, Point offset = Point());
Mat draw00 = Mat(resultCanny.size(), CV_8UC3, Scalar(255, 255, 255));findContours(resultCanny, Contours, Hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));//轮廓检测for (int i = 0; i < Contours.size(); i++){//Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));drawContours(draw00, Contours, i, (0, 0, 0), -1, 8, Hierarchy, 0, Point());//填充内部区域//circle(drawing_0, mc[i], 4, color, -1, 8, 0);}


6、再次使用轮廓提取函数findContours获取轮廓信息并计算轮廓矩和提取轮廓质心

findContours(dst_2, Contours, Hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));//轮廓检测vector<Moments> mu(Contours.size());vector<Point2f> mc(Contours.size());for (int i = 0; i < Contours.size(); i++) {mu[i] = moments(Contours[i], false);}for (int i = 0; i < Contours.size(); i++){mc[i] = Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);//质心计算 }


实验的源代码:

Mat src1 = imread("E:/标志检测/image/2/DMcameraTest-Snapshot-20161101081515-560083999222.BMP");Mat dst = src1.clone();//原图像深拷贝到目标图像Mat src2 = src1.clone();Mat blur_deal;int ksizes = 5;//medianBlur(src1, blur_deal, ksizes);//中值滤波处理bilateralFilter(src1, blur_deal,10,50,50);//双边滤波Mat result1, result2;TermCriteria T10 = TermCriteria(TermCriteria::COUNT | TermCriteria::EPS, 10, 0.1);pyrMeanShiftFiltering(blur_deal, result1, 5, 25, 2, T10);pyrMeanShiftFiltering(result1, result2, 5, 25, 2, T10);//pyrMeanShiftFiltering(result2, result2, 5, 25, 2, T10);namedWindow("分割结果", WINDOW_AUTOSIZE);imshow("分割结果", result1);//对图像进行Canny边缘检测Mat imgCanny, resultCanny;Canny(src1, imgCanny, 50, 100);Canny(result2, resultCanny,50,100);vector<vector<Point>> Contours;vector<Vec4i> Hierarchy;vector<Vec3f> circles;Mat gray_src;cvtColor(result2, gray_src, COLOR_BGR2GRAY);//转为灰度图像Mat draw00 = Mat(resultCanny.size(), CV_8UC3, Scalar(255,255,255));findContours(resultCanny, Contours, Hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));//轮廓检测for (int i = 0; i < Contours.size(); i++){drawContours(draw00, Contours, i, (0,0,0), -1, 8, Hierarchy, 0, Point());}Mat test00;cvtColor(draw00, test00,COLOR_BGR2GRAY);threshold(test00, test00, 100, 255, THRESH_BINARY_INV);//二值化findContours(test00, Contours, Hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));//轮廓检测vector<Moments> mu(Contours.size());vector<Point2f> mc(Contours.size());for (int i = 0; i < Contours.size(); i++) {mu[i] = moments(Contours[i], false);}for (int i = 0; i < Contours.size(); i++) {cout << "mu[].m10: " << mu[i].m10 << " mu[].m00: " << mu[i].m00 << " mu[].m01: " << mu[i].m01 << endl;cout << "轮廓大小:" << contourArea(Contours[i]) << endl;mc[i] = Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);//质心计算waitKey(0);return 0;}

利用opencv进行圆形标志提取和质心计算相关推荐

  1. 利用opencv进行图像处理,提取椭圆圆心处理

    利用opencv进行图像处理,提取椭圆圆心处理 写这个是因为项目正好在做这个,所以简单写写提取椭圆圆心坐标的代码,用的软件是VS. 首先介绍一下步骤,直接从图像处理开始 1,二值化处理(threhol ...

  2. 利用opencv创建圆形头像图标(背景透明)

    实现效果: 原图: 输出图像: //创建圆形头像图标 #include<opencv2/opencv.hpp> using namespace cv; using namespace st ...

  3. python opencv天空提取_python利用opencv实现印章的提取

    抽空写了下,怕找不到了,做个备份,直接上代码,嗯,自己能看懂就喜欢这种感觉: #coding:utf-8 import cv2 import numpy as np #加载图片 image = cv2 ...

  4. [毕设系列--参考文献内容整理] 视觉测量中圆形标志两种提取方法的比较

    目录 摘要 一.引言 二.基于感兴趣区域的最小二乘边缘拟合提取方法 2.1 感兴趣区域的提取 2.1.1 感兴趣区域 2.1.2 感兴趣区域的交互式提取 2.2 圆形标志的边缘提取 2.3 最小二乘边 ...

  5. 利用opencv结合mfc实现识别圆形标记点并计算多个圆形标记点的三维坐标,拟合平面并计算法向量

    利用opencv结合mfc实现识别圆形标记点并计算多个圆形标记点的三维坐标,拟合平面并计算法向量 具体步骤 二.对应代码 1.引入库 2.标定 识别圆形标记点 左右图像中圆形标记点匹配 计算三维坐标 ...

  6. 图像或轮廓的Hu矩的定义、优缺点、适用范围,并利用OpenCV的函数HuMoments()和matchShapes()实现Hu矩的计算和轮廓匹配

    本文承接博主的上一篇博文: 什么叫图像或轮廓的空间矩.中心矩.归一化中心矩?并利用OpenCV的类Moments计算轮廓的这几个矩和质心位置 继续介绍Hu矩的相关知识. Hu矩是由二阶和三阶中心距计算 ...

  7. 利用OpenCV、Python和Ubidots构建行人计数器程序(附完整代码)

    作者 | Jose Garcia 译者 | 吴振东 校对 | 张一豪.林亦霖,编辑 | 于腾凯 来源 | 数据派(ID:datapi) 导读:本文将利用OpenCV,Python和Ubidots来编写 ...

  8. 利用OpenCV识别玻璃纤维织物劈缝缺陷

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 玻璃纤维织物是经编多轴向织物,由一层或多层平行的纱线按照尽可能多的 ...

  9. 如何利用OpenCV寻找轮廓的中心?

    简 介: 本文介绍了利用OpenCV和Python编程来计算形状轮廓的中心点.当然后面还会继续给出如何通过轮廓来分辨物体形状种类,以及对于各自的颜色进行标准. 关键词: OpenCV,contours ...

最新文章

  1. java多层catch语句_Java异常之catch语句块
  2. python输入三个数输出最小值_python之输入一系列整数输出最大值
  3. (JAVA学习笔记) 关于稀疏数组
  4. 10.14 将n个数按输入输出顺序的逆序排列,用函数实现
  5. linux下启动oracle
  6. 【codevs1116】四色问题,深搜入门题目
  7. 【算法大赛直播周】如何赋予机器更多“想象力”?《计算广告》作者刘鹏带你解密深度学习
  8. ext3,ext4,xfs和btrfs文件系统性能对比
  9. cnblogs用户体验评价
  10. C++转erlang后感想
  11. 企业邮箱能帮企业带来哪些好处?
  12. 阿里国际站全球直播,短周期变现渠道受追捧
  13. xshell6无法卸载、重新安装【1628: 完成基于脚本的安装失败】
  14. STC51单片机15——MPU6050六轴数据融合,互补滤波,时间常数可调,可稳定运行,串口显示角度值
  15. A Game of Thrones(84)
  16. 腾讯云域名购买注意事项(申请注册必看)
  17. python tuple基本用法
  18. 大数据治理平台建设方案
  19. 三星游戏java ball_JavaBallGame 使用 语言设计的弹球游戏,可以学习 编写小 的方法。 Program 238万源代码下载- www.pudn.com...
  20. 2005年开启职业黑暗时代——北漂18年(50)

热门文章

  1. 【硬件】关于USB的一些小知识
  2. Java实现网络文件下载demo
  3. Xerces使用指南
  4. 基于对象分割的DEM 数据编辑
  5. 【JAVA进阶】static关键字详解
  6. 晶闸管直流开环调速系统—Simulink仿真
  7. linux c++ 程序运行core,gdb调试显示cannot access memory at address
  8. OpenRasp Java运行时修改字节码技术
  9. 人脸识别之DeepFace模型
  10. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java一起学习吧s77u8