暴力匹配法360度模板匹配OpenCV Python

3
我正在尝试使用以下模板图像找到原始图像上的所有箭头,并在它们周围绘制一个矩形。我不想使用Sift / Surf / Homography等技术,只想使用模板匹配。我只想使用一个模板,而不是生成360个单独的1度旋转模板作为参考。
模板图片: enter image description here 原始图片: enter image description here 这是我的代码:
import cv2
import numpy as np
import imutils

template = cv2.imread("C:\\Users\\Desktop\\All\\images\\template.png")
template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
_ ,template = cv2.threshold(template,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

image = cv2.imread("C:\\Users\\Desktop\\All\\images\\original image.png")
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_ ,image = cv2.threshold(image,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

MATCH_THRESH = 4000000

for degrees in range(0, 360, 1):
    rotate = imutils.rotate_bound(template,degrees)
    w, h = rotate.shape[::-1]
    res = cv2.matchTemplate(image, rotate, cv2.TM_SQDIFF)
    loc = np.where(res < MATCH_THRESH)
    for pt in zip(*loc[::-1]):
        rect = cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0,255,0), 4)
        cv2.imshow("matches",image)
        cv2.imshow("rectangle",rect)
        cv2.waitKey(500)
        cv2.destroyAllWindows()
        print('Match for deg{}, pt({}, {}), sqdiff {}'.
            format(degrees,pt[0],pt[1],res[pt[1],pt[0]]))

我将两个.png文件转换为灰度图像,然后再使用Otsu算法将其转换为黑白图像,这有助于模板匹配。接下来,我通过1度步长旋转模板图像360度,从0度开始。"degrees"变量保存当前的角度,并影响模板的旋转,使用此函数进行旋转:rotate = imutils.rotate_bound(template,degrees)。
然后,我对每个角度运行cv2.matchTemplate,并保存高于某个阈值的点的位置,并基于旋转后的模板大小绘制找到的匹配矩形。
这就是我遇到问题的地方。我似乎无法显示矩形。我知道它正在找到点,因为它已经说明了。我尝试了所有cv2.imshow的组合。你们看到了我没看到的东西吗? 谢谢。

这是一个打字错误。ReleaseKeys不是ReleaseKey - progmatico
1个回答

1

你无法看到有颜色的矩形,因为你试图在灰度图像中显示它。我建议在转换为灰度之前先存储一份副本,并使用它来显示矩形。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接