使用 cv2.HoughCircles 检测圆圈

Posted

技术标签:

【中文标题】使用 cv2.HoughCircles 检测圆圈【英文标题】:detect circles using cv2.HoughCircles 【发布时间】:2018-03-23 14:21:53 【问题描述】:

我有一张带圆圈的图片。有时 HoughCircles 会检测到这些圆圈并给我我所期望的。其他时候它不会检测到,即使图像有圆圈(所以它返回“无”)。

我正在使用的 detectCircles(path) 函数:

img = cv2.imread(path,0)
img = cv2.medianBlur(img,5) 
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
                        param1=50,param2=30,minRadius=0,maxRadius=0)

我认为这可能是我使用 HoughCircle 参数的方式,但我不明白如何定义这些参数。

我已经在这里查看了文档:https://docs.opencv.org/3.1.0/da/d53/tutorial_py_houghcircles.html

这里:https://docs.opencv.org/3.1.0/dd/d1a/group__imgproc__feature.html#ga47849c3be0d0406ad3ca45db65a25d2d

但我仍然不清楚。

HoughCircles 无法识别的第一张图片: http://www.image-share.com/ipng-3711-263.html

它只识别一个圆圈的第二张图片: http://www.image-share.com/ipng-3711-264.html

它完美识别的第三张图像: http://www.image-share.com/ipng-3711-265.html

【问题讨论】:

请贴出原图和过滤结果 @Micka,我重写了我的问题:) 【参考方案1】:

这里有更多关于参数的信息:

cvHoughCircles

inImage - 很明显 inDp - 分辨率乘数。如果您希望算法像素完美,请将其保留为“1”,但如果图像太大,您可以将其设置为“2”以使分辨率降低两倍 inMinDist - 圆圈之间的最小距离(以像素为单位)。如果您要查找大小为 100x100 像素的边界框大小的圆圈,则将此值调整为 20 像素是合理的。 inParam1 - 精明过滤器阈值。 强烈建议对cvCanny-ed 图像进行一些检查,以了解如何正确设置此阈值。我记得将它设置为 200 可以拍出漂亮明亮的照片。 inParam2 - 应该检测多少像素才能检测到圆? inMinRadius/inMaxRadius - 很明显

要帮助inParam2,请查看这张解释 Hough Circles 内部工作的图片。

当您cvCanny 您的图像时,您会得到所有这些白色和黑色像素。假设左边的这个白色轮廓是你的cvCanny-ized 圆圈。每个白色像素都在“投影”不同大小的圆圈。从红色圆圈 (minRadius) 开始,然后变大。绿色圆圈半径很大,所有点都在中间相遇。粉红色的点是“n”个绿色圆圈相交的地方。如果 'n' 大于 inParam2,则在此处找到圆圈。

【讨论】:

感谢标题!你的回答让事情更清楚了。我也要去看看cvCanny!

以上是关于使用 cv2.HoughCircles 检测圆圈的主要内容,如果未能解决你的问题,请参考以下文章

Python,OpenCV中的霍夫圆变换——cv2.HoughCircles()

如何在 cv2 和 python 中使用霍夫圆?

Python + OpenCV = 如何裁剪圆圈?

Python opencv进行圆形识别(圆检测)

Python:使用OpenCV返回图像中任意/牙齿形状的位置和大小

HoughCircles 无法检测此图像上的圆圈