如何在python中自动检测圆圈

时间:2018-12-09 22:13:04

标签: python image-processing hough-transform opencv-contour

我一直试图在具有不同背景(不一定是实心)的图像中计数硬币。这是我在答案中找到的代码,但是问题是我不想更改每个图像的参数。有办法吗?

def CountCoins_V2(img):
    image_ori = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    lower_bound = np.array([0,0,10])
    upper_bound = np.array([255,255,195])
    image = img
    mask = cv2.inRange(img, lower_bound, upper_bound)
    #mask = cv2.adaptiveThreshold(image_ori,255,cv2.ADAPTIVE_THRESH_MEAN_C,\cv2.THRESH_BINARY_INV,33,2)
    kernel = np.ones((3, 3), np.uint8)
    mask = cv2.erode(mask, kernel, iterations=6)
    mask = cv2.dilate(mask, kernel, iterations=3)
    closing = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
    contours = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
    contours.sort(key=lambda x:cv2.boundingRect(x)[0])
    array = []
    ii = 1
    for c in contours:
        (x,y),r = cv2.minEnclosingCircle(c)
        center = (int(x),int(y))
        r = int(r)
        if r >= 6 and r<=10:
            cv2.circle(image,center,r,(0,255,0),2)
            array.append(center)
    show_images([image_ori,mask])
    return len(contours)

1 个答案:

答案 0 :(得分:0)

代码中有2个参数:

  • 第一个是lower_bound = np.array([0,0,10])upper_bound = np.array([255,255,195]),它们将图像阈值限制为仅获取lower_boundupper_bound之间的颜色。但是在这段代码中,范围从[0,0,10][255,255,195]太宽,因此没有任何意义。您应该将此范围限制为更接近要检测的圆圈的颜色。您可以阅读有关颜色空间和阈值样本here的更多信息。
  • 第二个是r中的(x,y),r = cv2.minEnclosingCircle(c),它是图像中找到的圆的半径。这是一个重要的参数,您需要进行实验以找到所有图像的最佳范围。我的建议是在图像的半径与宽度或高度之间使用比率,因此它将与图像的分辨率无关。