我一直试图在具有不同背景(不一定是实心)的图像中计数硬币。这是我在答案中找到的代码,但是问题是我不想更改每个图像的参数。有办法吗?
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)
答案 0 :(得分:0)
代码中有2个参数:
lower_bound = np.array([0,0,10])
和upper_bound = np.array([255,255,195])
,它们将图像阈值限制为仅获取lower_bound
和upper_bound
之间的颜色。但是在这段代码中,范围从[0,0,10]
到[255,255,195]
太宽,因此没有任何意义。您应该将此范围限制为更接近要检测的圆圈的颜色。您可以阅读有关颜色空间和阈值样本here的更多信息。r
中的(x,y),r = cv2.minEnclosingCircle(c)
,它是图像中找到的圆的半径。这是一个重要的参数,您需要进行实验以找到所有图像的最佳范围。我的建议是在图像的半径与宽度或高度之间使用比率,因此它将与图像的分辨率无关。