进行霍夫圆变换中有一个API:HoughCircles()。
第五个参数为double类型的minDist(),为霍夫变换检测到的圆的圆心之间的最小距离,即让算法能明显区分的两个不同圆之间的最小距离。这个参数如果设置太小,多个相邻的圆可能被错误的检测成了一个重合的圆。反之,如果设置太大,某些圆就不能检测出来。
第七个参数,它越小,就越可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了。
1 #include<opencv2/opencv.hpp> 2 3 using namespace std; 4 using namespace cv; 5 6 int main() 7 { 8 Mat src = imread("D:/yuan.jpg");//读取原图 9 10 Mat mid, dst;//mat类型的中间变量和目标图像 11 12 dst = src.clone();//原图像深拷贝到目标图像 13 14 cvtColor(dst, mid, COLOR_BGR2GRAY); //转化为灰度图像 15 GaussianBlur(mid, mid, Size(9, 9), 2, 2); //高斯滤波 16 17 //进行霍夫圆变换 18 vector<Vec3f>circles; 19 HoughCircles(mid, circles, HOUGH_GRADIENT, 1.5, 35, 200, 150, 0, 0); 20 //依次在图中绘制出圆 21 for (size_t i = 0; i < circles.size(); i++) 22 { 23 //找出圆心和半径 24 Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); 25 int radius = cvRound(circles[i][2]); 26 //绘制圆心和半径 27 circle(dst, center, 3, Scalar(0, 255, 0), -1, 8, 0); 28 circle(dst, center, radius, Scalar(155, 50, 255), 3, 8, 0); 29 30 } 31 //显示原图 32 namedWindow("原图", CV_WINDOW_AUTOSIZE); 33 imshow("原图", src); 34 //显示效果图 35 namedWindow("效果图", CV_WINDOW_AUTOSIZE); 36 imshow("效果图",dst); 37 imwrite("D:/learn-opencv/houghcircles.jpg", dst); 38 waitKey(0); 39 return 0; 40 41 }
原图:
效果图: