找圆

转载 2012年03月26日 15:18:13

霍夫圆变换的函数为:

HoughCircles

利用 Hough 变换在灰度图像中找圆

CvSeq* cvHoughCircles( CvArr* image, void* circle_storage,
                       int method, double dp, double min_dist,
                       double param1=100, double param2=100,
                       int min_radius=0, int max_radius=0 );
image
输入 8-比特、单通道灰度图像.
circle_storage
检测到的圆存储仓. 可以是内存存储仓(此种情况下,一个线段序列在存储仓中被创建,并且由函数返回)或者是包含圆参数的特殊类型的具有单行/单列的CV_32FC3型矩阵(CvMat*).矩阵头为函数所修改,使得它的 cols/rows 将包含一组检测到的圆。如果 circle_storage是矩阵,而实际圆的数目超过矩阵尺寸,那么最大可能数目的圆被返回

. 每个圆由三个浮点数表示:圆心坐标(x,y)和半径.

method
Hough 变换方式,目前只支持CV_HOUGH_GRADIENT, which is basically 21HT, described in [Yuen03].
dp
累加器图像的分辨率。这个参数允许创建一个比输入图像分辨率低的累加器。(这样做是因为有理由认为图像中存在的圆会自然降低到与图像宽高相同数量的范畴)。如果dp设置为1,则分辨率是相同的;如果设置为更大的值(比如2),累加器的分辨率受此影响会变小(此情况下为一半)。dp的值不能比1小。

Resolutionof the accumulator used to detect centers of the circles. For example,if it is 1, the accumulator will have the same resolution as the inputimage, if it is 2 - accumulator will have twice smaller width andheight, etc.

min_dist
该参数是让算法能明显区分的两个不同圆之间的最小距离。

Minimumdistance between centers of the detected circles. If the parameter istoo small, multiple neighbor circles may be falsely detected inaddition to a true one. If it is too large, some circles may be missed.

param1
用于Canny的边缘阀值上限,下限被置为上限的一半。

Thefirst method-specific parameter. In case of CV_HOUGH_GRADIENT it is thehigher threshold of the two passed to Canny edge detector (the lowerone will be twice smaller).

param2
累加器的阀值。

Thesecond method-specific parameter. In case of CV_HOUGH_GRADIENT it isaccumulator threshold at the center detection stage. The smaller it is,the more false circles may be detected. Circles, corresponding to thelarger accumulator values, will be returned first.

min_radius
最小圆半径。

Minimal radius of the circles to search for.

max_radius
最大圆半径。

Maximal radius of the circles to search for. By default the maximal radius is set to max(image_width, image_height).

The function cvHoughCircles finds circles in grayscale image using some modification of Hough transform.

Example. Detecting circles with Hough transform.

实现例题:
  1. #include "stdafx.h"  
  2. #include "stdafx.h"  
  3. #include "cv.h"  
  4. #include "highgui.h"  
  5. #include <math.h>  
  6. int _tmain(int argc, _TCHAR* argv[])  
  7. {  
  8.     IplImage* image0=cvLoadImage("circle.bmp",CV_LOAD_IMAGE_GRAYSCALE);  
  9.     IplImage* image= cvLoadImage("circle.bmp",CV_LOAD_IMAGE_GRAYSCALE);  
  10.     //IplImage* image=NULL;//  
  11.     //image=cvCreateImage(cvGetSize(image0),IPL_DEPTH_8U,3);   
  12.     CvMemStorage* storage=cvCreateMemStorage(0);  
  13.     cvSmooth(image0,image,CV_GAUSSIAN,5,5);  
  14.     CvSeq* results=cvHoughCircles(image,storage,CV_HOUGH_GRADIENT,2,image->width /10);  
  15.     for(int i=0;i<results->total ;i++)  
  16.     {  
  17.         float* p=(float*) cvGetSeqElem(results,i);  
  18.         CvPoint pt=cvPoint(cvRound(p[0]),cvRound(p[1]));  
  19.         cvCircle(image,pt,cvRound(p[2]),CV_RGB(0xff,0xff,0xff));  
  20.     }  
  21.     cvNamedWindow("source",0);  
  22.     cvShowImage("source",image0);  
  23.     cvNamedWindow("cvHoughCircles",0);  
  24.     cvShowImage("cvHoughCircles",image);  
  25.     cvWaitKey(0);  
  26.     return 0;  
  27. }  

运算结果不是太理想:

参考资料:‘

1.学习OpenCV,于仕祺,刘瑞祯,清华大学出版社,pp.179-183

2.http://www.opencv.org.cn/index.php/Cv%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86#HoughLines


PS:修改一下:

  1. #include "stdafx.h"    
  2. #include "stdafx.h"    
  3. #include "cv.h"    
  4. #include "highgui.h"    
  5. #include <math.h>    
  6. int _tmain(int argc, _TCHAR* argv[])    
  7. {    
  8.     IplImage* image0=cvLoadImage("circle.bmp",CV_LOAD_IMAGE_GRAYSCALE);    
  9.     //IplImage* image= cvLoadImage("circle.bmp",CV_LOAD_IMAGE_GRAYSCALE);    
  10.     IplImage *image1=cvLoadImage("circle.bmp",1);  
  11.     //IplImage* image=NULL;//    
  12.     //image=cvCreateImage(cvGetSize(image0),IPL_DEPTH_8U,3);     
  13.     CvMemStorage* storage=cvCreateMemStorage(0);    
  14.     //cvSmooth(image0,image,CV_GAUSSIAN,5,5);    
  15.     CvSeq* results=cvHoughCircles(image0,storage,CV_HOUGH_GRADIENT,2,image0->width /10);    
  16.     for(int i=0;i<results->total ;i++)    
  17.     {    
  18.         float* p=(float*) cvGetSeqElem(results,i);    
  19.         CvPoint pt=cvPoint(cvRound(p[0]),cvRound(p[1]));    
  20.         cvCircle(image1,pt,cvRound(p[2]),CV_RGB(255,0,0));    
  21.     }    
  22.     cvNamedWindow("source",0);    
  23.     cvShowImage("source",image0);    
  24.     cvNamedWindow("cvHoughCircles",0);    
  25.     cvShowImage("cvHoughCircles",image1);    
  26.     cvWaitKey(0);    
  27.     return 0;    
  28. }    

结果:


看起来清楚些,可是还是检测的不好。

相关文章推荐

halcon写的spoke找圆

halcon找圆demo

  • 2017-06-05 17:34
  • 12.63MB
  • 下载

(python)opencv找圆cv2.houghCircles()

关于函数参数输入输出: cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadi...

霍夫变换找圆

  • 2016-04-26 16:40
  • 704KB
  • 下载

关于霍夫找圆算法cvHoughCircles的参数

【原文:http://b217dgy.blog.51cto.com/5704306/1320360】 霍夫圆变换的函数为: HoughCircles 利用...

如何找到两个圆的公切线?

大家都提供了道,我来提供术。我最近在自学python,题主如果想学python,可以私信微信号给我,我们一起努力啊。 我采用的是 @vczh的算法,期间程序有问题,我手算了一条内公切线的斜率,用的是 ...

关于霍夫找圆算法cvHoughCircles的

http://b217dgy.blog.51cto.com/5704306/1320360 霍夫圆变换的函数为: HoughCircles 利...

双目相机采集找票

51NOD 1491 黄金系统 && Codeforces 458 A. Golden System(斐波那契数列 + 找规律)

传送门 q = 5√+12q \ =\ \frac{\sqrt5+1} 2在黄金系统下面a0a1...ana_0a_1...a_n等于 ∑ni=0ai∗qn−i\sum_{i=0}^n a_i∗q^...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)