原理:

我们要从一副图像中检测出半径以知的圆形来。这个问题比前一个还要直观。我们可以取和图像平面一样的参数平面,以图像上每一个前景点为圆心,以已知的半径在参数平面上画圆,并把结果进行累加。最后找出参数平面上的峰值点,这个位置就对应了图像上的圆心。在这个问题里,图像平面上的每一点对应到参数平面上的一个圆。

把上面的问题改一下,假如我们不知道半径的值,而要找出图像上的圆来。这样,一个办法是把参数平面扩大称为三维空间。就是说,参数空间变为x--y--R三维,对应圆的圆心和半径。图像平面上的每一点就对应于参数空间中每个半径下的一个圆,这实际上是一个圆锥。最后当然还是找参数空间中的峰值点。不过,这个方法显然需要大量的内存,运行速度也会是很大问题。

有什么更好的方法么?我们前面假定的图像都是黑白图像(2值图像),实际上这些2值图像多是彩色或灰度图像通过边缘提取来的。我们前面提到过,图像边缘除了位置信息,还有方向信息也很重要,这里就用上了。根据圆的性质,圆的半径一定在垂直于圆的切线的直线上,也就是说,在圆上任意一点的法线上。这样,解决上面的问题,我们仍采用2维的参数空间,对于图像上的每一前景点,加上它的方向信息,都可以确定出一条直线,圆的圆心就在这条直线上。这样一来,问题就会简单了许多。

代码:

 // 加载原图  IplImage *pSrcImage = cvLoadImage("C:\\Users\\徐图之\\Desktop\\33.bmp", -1);IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);//cvSmooth(pGrayImage, pGrayImage);  // 圆检测(灰度图)  CvMemStorage *pcvMStorage = cvCreateMemStorage();double fMinCircleGap = pGrayImage->height / 40;CvSeq *pcvSeqCircles = cvHoughCircles(pGrayImage, pcvMStorage, CV_HOUGH_GRADIENT, 1.8, fMinCircleGap);//每个圆由三个浮点数表示:圆心坐标(x,y)和半径  // 绘制直线  IplImage *pColorImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U, 3);cvCvtColor(pGrayImage, pColorImage, CV_GRAY2BGR);for (int i = 0; i < pcvSeqCircles->total; i++){float* p = (float*)cvGetSeqElem(pcvSeqCircles, i);CvPoint pt = cvPoint(cvRound(p[0]), cvRound(p[1]));cvCircle(pColorImage, pt, cvRound(p[2]), CV_RGB(255, 0, 0), 2);}cvNamedWindow("pstrWindowsSrcTitle", CV_WINDOW_AUTOSIZE);cvShowImage("pstrWindowsSrcTitle", pGrayImage);cvNamedWindow("Name", CV_WINDOW_AUTOSIZE);cvShowImage("Name", pColorImage);cvWaitKey(0);cvReleaseMemStorage(&pcvMStorage);cvDestroyWindow("pstrWindowsSrcTitle");cvDestroyWindow("pstrWindowsLineName");cvReleaseImage(&pGrayImage);cvReleaseImage(&pColorImage);

cvHoughCircles这个函数的函数原形如下:
CVAPI(CvSeq*) cvHoughCircles(
  CvArr* image, void* circle_storage,
  int method,
  double dp,
  double min_dist,
  double param1 CV_DEFAULT(100),
  double param2 CV_DEFAULT(100),
  int min_radius CV_DEFAULT(0),
  int max_radius CV_DEFAULT(0)
);

可以看出cvHoughCircles与上一章的cvHoughLines2函数比较类似,因此讲下部分参数的意思就可以了:
第二个参数表示Hough变换方式,目前只能用CV_HOUGH_GRADIENT。
第三个参数表示寻找圆弧圆心的累计分辨率,通常设置成1就可以了,如果检测不出来,可以设置大一点
第四个参数表示两个不同圆之间的最小距离,由于是按圆心来计算距离的,因此对同心圆的检测就无能为力了。
注意,圆检测函数可以使用灰度图。

Hough变换检测圆相关推荐

  1. MATLAB编程 利用Hough变换检测圆

    MATLAB代码下载:利用Hough变换检测圆.docx-专业指导文档类资源-CSDN下载利用Hough变换检测圆,可以设置要检测圆的个数,最小尺寸.更多下载资源.学习资料请访问CSDN下载频道.ht ...

  2. 霍夫变换检测圆c 语言,c – 使用Hough变换检测圆

    我正在尝试使用霍夫变换来检测圆圈. 使用我当前的代码,我可以检测到下面的代码 但我想在我发现的圆圈内找到黑洞. 然而,改变houghcircle方法的参数对我没有帮助.实际上它找到了不存在的圆圈. 此 ...

  3. Hough变换检测直线与圆的原理

    霍夫变换的基本原理 霍夫变换(Hough Transform)可以理解为图像处理中的一种特征提取技术,通过投票算法检测具有特定形状的物体.霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的 ...

  4. hough变换检测直线 matlab,Matlab实现Hough变换检测图像中的直线

    Hough变换的原理: 将图像从图像空间变换至参数空间,变换公式如下: 变换以后,图像空间与参数空间存在以下关系: 图像空间中的一点在参数空间是一条曲线,而图像空间共线的各点对应于参数空间交于一点的各 ...

  5. hough变换检测圆周_用点Hough变换实现圆检测的方法

    图像中圆的检测及其参数确定是计算机视觉和模式识 别中一项重要任务.常用的圆检测技术有形状分析法.环路积分微分法[1].圆变换()HoughCHT [2]等.是目前应用CHT 最为广泛的圆检测方法,该方 ...

  6. hough变换检测圆周_hough变换原理以及实现(转载)

    原理链接如下:陌归:霍夫(Hough)变换之直线检测 代码链接:Ganso:Fundamentals--从车道线检测谈到霍夫变换 同样是一篇讲解原理的番外,这一篇主要讲解CV中常用的霍夫变换的数学原理 ...

  7. hough变换检测圆周_Python OpenCV 霍夫变换

    霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体.Hough变换是图像处理中从图像中识别几何形状的基本方法之一.Hough变换的基本原 ...

  8. hough变换检测圆周_一文解读经典霍夫变换(Hough Transform)

    引言 本文讲述霍夫变换的一些内容,并加入一些理解性东西,参考了部分博客等相关性内容.希望能对霍夫变换有所了解,也希望看到的人如果发现错误及时帮忙纠正.博主水平有限,还望赐教. 历史和简介 历史 霍夫变 ...

  9. hough变换检测圆周_【视觉】视觉检测人应该了解的缺陷检测方法

    本文参考并摘引:李少波, 杨静, 王铮, 朱书德, 杨观赐. 缺陷检测技术的发展与应用研究综述. 自动化学报, 2020, 46(11): 2319−2336. doi: 10.16383/j.aas ...

  10. Hough变换检测椭圆 附带matlab与opencv代码

     由椭圆的公式(1)可得,确定一个椭圆需要5个参数,a,b 为椭圆的长轴和段轴,P,Q 为椭圆中心坐标,θ为椭圆的旋转角度.如果用传统的Hough变换方法,参数空间需要五维.这种方法在计算过程中所耗费 ...

最新文章

  1. java facets_Java UIComponent.getFacets方法代码示例
  2. MPB:EGFP荧光标记大肠杆菌的构建
  3. JavaScript 编码小技巧
  4. MySQL注入中报错的利用
  5. 实现一个MVVM和promise
  6. HDU 1159 Common Subsequence 动态规划
  7. 国家网信办:督促知乎、豆瓣等20家知识社区问答平台开展自查自纠
  8. java使用jsp建立项目+视频
  9. Html文档与基本语法和规范
  10. VMware ESXi 6.7 安装LEDE
  11. DIV+CSS图片和文字如何显示同一行
  12. 我们不曾向这个世界的庸俗低头
  13. 定义图书类Book,具有属性账号id,铭name.作者author和价格price,在创建图书对象时要求通过构造器进行创建,- -次性将四个属性全部赋值
  14. 叶酸修饰四氧化三铁纳米颗粒(FA-Fe3O4)|Cys-Fe3O4/CuS@BSA|巯基修饰的四氧化三铁磁性纳米颗粒齐岳供应
  15. 黑苹果和笔记本键盘按键的映射及快捷键的设置
  16. OA系统集团化共享服务平台,全面协同、全面移动
  17. 计算机系统用户登录密码错误,电脑开机密码正确却进不去,老提示密码错误
  18. java音频剪切_Java使用IO流实现音频的剪切和拼接
  19. 护眼灯到底有没有护眼的效果?带你了解市面上的护眼灯真的护眼吗
  20. Linux服务器的配置和数据迁移方案

热门文章

  1. HDU 1730 Northcott Game
  2. JS控制浏览器捕捉键盘
  3. ARC098E Range Minimum Queries
  4. 配置grafana的数据源、添加监控
  5. python的命名空间_python的命名空间
  6. cad两直线相交画圆弧_在CAD图纸中绘制中心线的操作技巧
  7. python 消息队列 go_Python并发编程-RabbitMq消息队列
  8. java 子类 继承父类的注解,spring使用注解通过子类注入父类的私有变量
  9. android+图标自动排列,Android用RecyclerView实现图标拖拽排序以及增删管理
  10. java泛化_java 类字面常量,泛化的Class引用