查找图像中圆圈的质心和颜色值

时间:2018-02-21 10:46:47

标签: python-3.x opencv image-processing

我有8个蓝色和8个红色圆圈的图像。
我想找到每个圆圈的中心位置((x, y)),我也想知道圆圈是红色还是蓝色。 圆圈的直径可能略有不同。

This is what I'm trying to process
感觉这并不难解决,但这对我来说很难......

我按照tutorial尝试使用OpenCV和模板匹配。它找到所有圆圈但我不知道如何精确定位中心或选择圆圈颜色
它似乎也为每个圆圈绘制了超过1个矩形。

Circles identified using Template Matching

img_rgb = cv2.imread('images/img.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('red.png',0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.66
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 1)

我还尝试了Hough Circles。但是根本没有任何结果。也许我的圈子太小而不是真圆圈,像素显示。

模板匹配是正确的方法,即使我没有让它一直工作,还是可以更容易地以另一种方式完成?

非常感谢任何帮助 谢谢马丁

1 个答案:

答案 0 :(得分:0)

我使用findContours自己解决了这个问题。

image = cv2.imread('images/img.png')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
thresh = cv2.threshold(blurred, 80, 255, cv2.THRESH_BINARY)[1]
cnts = cv2.findContours(thresh.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]

coordinates = []
for c in cnts:
    M = cv2.moments(c)
    cX = int(M["m10"] / M["m00"])
    cY = int(M["m01"] / M["m00"])
    #cv2.circle(image, (cX, cY), 1, (255, 255, 255), -1)
    coordinates.append([cX,cY])