【发布时间】:2019-01-26 10:15:25
【问题描述】:
我试图使用HoughCircles 检测下图中的圆圈。
这是我用来查找所有圆圈的代码。
import cv2
import numpy as np
img = cv2.imread("images/coins.jpg", 0)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
minDist = 247
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,minDist,
param1=170,param2=80,minRadius=0,maxRadius=0)
print(circles)
#print("Number of circles detected ", circles.length)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
对于我尝试的所有方法,我都无法检测到一枚硬币。检测到的圆圈如下所示。
我在这里有三个问题:
- 没有检测到第一行左起第二个硬币的原因可能是什么?
-
minDist参数有什么作用?你能解释一下它是如何工作的吗?我阅读了文档但无法理解。 -
minRadius和maxRadius的zero在这里是什么意思?
【问题讨论】:
-
minDist 检测到的圆的中心之间的最小距离。如果参数太小,除了一个真实的圆圈外,可能还会错误地检测到多个相邻圆圈。如果它太大,可能会漏掉一些圆圈。 如果你的红点之间的距离太小,你会得到错误的结果......
-
minRadius 最小圆半径。 maxRadius 最大圆半径。 .. 绿色圆所需的最小半径和绿色物体的最大可能半径 ....
-
@PatrickArtner 是的,我在文档中读过这个。但无法理解多个圈子的事情。
-
看到 2005 -- 00 是圆圈...如果你将 247 降低到 40,猜想它们也会被检测到。并且 0 是给定的默认值......我会 guess 这意味着是 not 使用(尽管文档没有明确说明) .但如果它将在 0 时使用......它应该永远找不到任何东西,不是吗?
-
我可能会编写一个循环并计算
circles的长度,从 minDist 300 开始,每次应用HoughCircles获得少于 8 个结果时将其减少 10。如果您对像素中硬币的大小有所了解,我会将 minRadius 设置为硬币半径的 2/3,将 maxRadius 设置为硬币半径的 4/3,以排除发现非常小或太大的圆圈。如果你仍然没有得到 8 个硬币,你可能需要增强轮廓(锐化 fe),但我猜图像很好,因为 7 和 1 个硬币之间的差异对肉眼来说并没有那么大。
标签: python opencv computer-vision hough-transform