为什么HoughCircles无法检测到一个圆? minDist如何工作?

时间:2019-01-26 10:15:26

标签: python opencv computer-vision hough-transform

我正尝试使用HoughCircles检测下图中的圆圈。

enter image description here

这是我正在查找所有圈子的代码。

    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()

对于我尝试的所有操作,我都无法检测到一枚硬币。检测到的圆圈如下所示。

enter image description here

我在这里有三个问题:

  • 未检测到第一行左侧第二个硬币的原因可能是什么?
  • minDist参数有什么作用?您能解释一下它是如何工作的吗?我阅读了文档,但听不懂。
  • minRadius中的maxRadiuszero在这里是什么意思?

1 个答案:

答案 0 :(得分:4)

  1. 未检测到第一行左侧第二个硬币的原因是什么?

    • 由于精明边缘检测参数param1,未检测到第二枚硬币。 降低param1的值,您将得到一个完美的答案。
  2. minDist参数有什么作用?您能解释一下它是如何工作的吗?我阅读了文档,但听不懂。

    • 并且根据文档minDist是2个圆圈之间的最小值。如果减小minDist的值,则会得到多个相邻的圆圈。
  3. minRadius中的maxRadiuszero是什么意思?

    • 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()

在这里您可以看到我也得到了第二枚硬币。 enter image description here