霍夫圆检测失灵
有一位网友在贴了一张图在一个QQ群里,碰巧我也在群里,他通过二值化然后来寻找这四个圆,发现无法达到效果!然后又通过轮廓发现,发现效果也不尽如意!我在群里建议试试霍夫变换,测试结果是没有效果,根本就无法检测。
原因分析与解锁
我就用他给的这张图,用霍夫圆检测,测试一下效果如下:
然后他就问我参数是什么,跟他有什么不一样,其实我跟他唯一的不一样的地方就是反向比率,这个是霍夫圆检测函数中经常被忽视的一个参数,但是实际上它又无比的重要!可以重新看一下这个函数与参数说明如下:
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值适度增加,这样会大大提高霍夫圆的检测能力!
对上述图象,其它参数不变的情况下:
说明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号高手
推荐阅读
- 这才是Self-Attention与CNN正确的融合范式,性能速度全面提升
- 即插即用 | 5行代码实现NAM注意力机制让ResNet、MobileNet轻松涨点(超越CBAM)
- OpenCV+MediaPipe五分钟搞定人脸3D点云提取
更多嵌入式AI技术相关内容请关注嵌入式AI专栏。