【发布时间】:2016-05-03 04:44:46
【问题描述】:
我正在使用 Python 的 OpenCV 库来检测图像中的圆圈。作为测试用例,我使用的是下图:
罐底:
我写了下面的代码,它应该在检测之前显示图像,然后显示添加了检测到的圆圈的图像:
import cv2
import numpy as np
image = cv2.imread('can.png')
image_rgb = image.copy()
image_copy = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
grayscaled_image = cv2.cvtColor(image_copy, cv2.COLOR_GRAY2BGR)
cv2.imshow("confirm", grayscaled_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
circles = cv2.HoughCircles(image_copy, cv2.HOUGH_GRADIENT, 1.3, 20, param1=60, param2=33, minRadius=10,maxRadius=28)
if circles is not None:
print("FOUND CIRCLES")
circles = np.round(circles[0, :]).astype("int")
print(circles)
for (x, y, r) in circles:
cv2.circle(image, (x, y), r, (255, 0, 0), 4)
cv2.rectangle(image, (x - 5, y - 5), (x + 5, y + 5), (0, 128, 255), -1)
cv2.imshow("Test", image + image_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()
我得到这个:结果图像
我觉得我的问题在于HoughCircles()函数的使用。它的用法是:
cv2.HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]])
其中minDist 是一个大于 0 的值,它要求检测到的圆圈彼此之间有一定的距离。有了这个要求,我就不可能正确检测罐底的所有圆圈,因为每个圆圈的中心都在同一个地方。轮廓会是一个解决方案吗?如何将轮廓转换为圆形,以便可以使用它们的中心点坐标?我应该怎么做才能最好地检测罐底每个环的圆形物体?
【问题讨论】:
-
不是您的问题的一部分,而是为了将来:
image_copy = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)应该是image_copy = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)而不是我猜)。