【问题标题】:Why does one circle go undetected by HoughCircles? How does minDist work?为什么 HoughCircles 没有检测到一个圆圈? minDist 是如何工作的?
【发布时间】: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


【解决方案1】:
  1. 没有检测到第一行左数第二个硬币的原因可能是什么?

    • 第二枚硬币没有被检测到,因为canny边缘检测参数:param1。 降低param1的值,你会得到完美的答案。
  2. minDist 参数有什么作用?你能解释一下它是如何工作的吗?我阅读了文档但无法理解。

    • 根据文档minDist 是两个圆圈之间的最小值。如果你减少minDist 的值,你会得到多个邻居圈子。
  3. zero 的 minRadius 和 maxRadius 在这里是什么意思?

    • minRadius 最小圆半径。
    • maxRadius 最大圆半径。如果<= 0,则使用最大图像尺寸。如果是< 0,则返回中心而不求半径。

这里是完整的代码:

import cv2
import numpy as np


img = cv2.imread("coins.jpg", 0)

cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

minDist = 247

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,minDist,
                param1=150,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.imwrite('detected_circle.jpg',cimg)
cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里你可以看到我也拿到了第二枚硬币。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多