我有8个蓝色和8个红色圆圈的图像。
我想找到每个圆圈的中心位置((x, y)
),我也想知道圆圈是红色还是蓝色。
圆圈的直径可能略有不同。
我按照tutorial尝试使用OpenCV
和模板匹配。它找到所有圆圈但我不知道如何精确定位中心或选择圆圈颜色。
它似乎也为每个圆圈绘制了超过1个矩形。
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
。但是根本没有任何结果。也许我的圈子太小而不是真圆圈,像素显示。
模板匹配是正确的方法,即使我没有让它一直工作,还是可以更容易地以另一种方式完成?
非常感谢任何帮助 谢谢马丁
答案 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])