爱笑的小姐姐 · 2021年12月06日

想用好OpenCV霍夫圆检测,必知的一个重要参数!

霍夫圆检测失灵

有一位网友在贴了一张图在一个QQ群里,碰巧我也在群里,他通过二值化然后来寻找这四个圆,发现无法达到效果!然后又通过轮廓发现,发现效果也不尽如意!我在群里建议试试霍夫变换,测试结果是没有效果,根本就无法检测。

image.png

原因分析与解锁

我就用他给的这张图,用霍夫圆检测,测试一下效果如下:
image.png
然后他就问我参数是什么,跟他有什么不一样,其实我跟他唯一的不一样的地方就是反向比率,这个是霍夫圆检测函数中经常被忽视的一个参数,但是实际上它又无比的重要!可以重新看一下这个函数与参数说明如下:

void cv::HoughCircles (
         InputArray  image, 
         OutputArray  circles, 
         int  method, 
         double  dp, 
         double  minDist, 
         double  param1 = 100, 
         double  param2 = 100, 
         int  minRadius = 0, 
         int  maxRadius = 0 
)

其中dp参数,霍夫检测圆是基于梯度的,梯度良好的情况下dp=1没有问题,当梯度周围或者圆上有干扰的时候,应当是当减小累计值,所以需要把dp值适度增加,这样会大大提高霍夫圆的检测能力!

对上述图象,其它参数不变的情况下:
image.png
image.png

说明dp值会直接影响霍夫圆检测结果。最后附上测试代码:

Mat gray;
double dp = 1.2; // 在其它参数保持不变的情况下。dp的取值越高,越容易检测到圆,
int min_radius = 100;
int max_radius = 120;
int minDist = 20;
int low_grad = 50;
int hight_grad = 100;
Mat src = imread("D:/images/vm_test/ball.jpg");
imshow("input", src);
cvtColor(src, gray, COLOR_BGR2GRAY);
// GaussianBlur(gray, gray, Size(9, 9), 2, 2);
vector<Vec3f> circles;
HoughCircles(gray, circles, HOUGH_GRADIENT, dp, minDist, hight_grad, low_grad, min_radius, max_radius);
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(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);
    circle(src, center, radius, Scalar(0, 0, 255), 3, 8, 0);
}
namedWindow("circles", 1);
imshow("circles", src);
waitKey(0);

希望大家从此都可以成功解锁OpenCV中霍夫圆检测函数使用!

原文链接:OpenCV开发者联盟
作者:2号高手

推荐阅读

更多嵌入式AI技术相关内容请关注嵌入式AI专栏。
推荐阅读
关注数
18838
内容数
1372
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息