我试图使用HoughCircles方法从图像中检测圆形,但看起来这个方法无法检测到所有中心几乎相同的圆。例如,如果我有三个中心几乎相同的圆,它会检测为一个圆。请问有没有什么方法可以找到所有这些圆。以下是源图像:
我可能对HoughCircle方法的假设有误。
提前感谢。
回答:
原因是在调用HoughCircles时,您需要决定检测到的圆心之间的最小距离。您提到的相同中心意味着它们之间的距离为零。因此,在这种情况下,您应该将最小距离参数设置为接近0的值。
void cv::HoughCircles ( InputArray image,OutputArray circles,int method,double dp,double minDist, // 您应该将此参数设置为接近零的值,因为0不被接受。double param1 = 100,double param2 = 100,int minRadius = 0,int maxRadius = 0 )
当我使用以下参数尝试时:
HoughCircles( input, output, CV_HOUGH_GRADIENT, 1, 0.5, 60, 30, 1, 200 );
我得到了以下结果:
编辑:当我进一步尝试时,我检测到了12个圆,但实际有18个圆(不包括边缘圆)。原因可能是图像质量的问题。以下是我的代码和结果:
#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace cv;using namespace std;int main(){ /// 加载源图像并转换为灰度 Mat src_gray,dst,src = imread("/ur/source/image/image.jpg", 1 ); imshow("源图像",src); int i = 50; bilateralFilter(src,dst,i,i*2,i/2); imshow("输出",dst); cvtColor( dst, src_gray, CV_BGR2GRAY ); vector<Vec3f> circles; /// 应用霍夫变换以查找圆 HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, 0.01, 80, 55, 0, 100 ); Mat zero_mask = Mat::zeros(src.rows,src.cols,CV_8UC3); /// 绘制检测到的圆 for( size_t i = 0; i < circles.size(); i++ ) { Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); int radius = cvRound(circles[i][2]); // 圆心 circle( zero_mask, center, 3, Scalar(0,255,0), -1, 8, 0 ); // 圆轮廓 circle( zero_mask, center, radius, Scalar(0,0,255), 1, 8, 0 ); } cout<<circles.size()<<endl; imshow("输出2",src_gray); imshow("输出",zero_mask); waitKey(0); return(0);}
输出: