我正在尝试使用以下模板图像找到原始图像上的所有箭头,并在它们周围绘制一个矩形。我不想使用Sift / Surf / Homography等技术,只想使用模板匹配。我只想使用一个模板,而不是生成360个单独的1度旋转模板作为参考。
模板图片:
原始图片:
这是我的代码:
我将两个.png文件转换为灰度图像,然后再使用Otsu算法将其转换为黑白图像,这有助于模板匹配。接下来,我通过1度步长旋转模板图像360度,从0度开始。"degrees"变量保存当前的角度,并影响模板的旋转,使用此函数进行旋转:rotate = imutils.rotate_bound(template,degrees)。
然后,我对每个角度运行cv2.matchTemplate,并保存高于某个阈值的点的位置,并基于旋转后的模板大小绘制找到的匹配矩形。
这就是我遇到问题的地方。我似乎无法显示矩形。我知道它正在找到点,因为它已经说明了。我尝试了所有cv2.imshow的组合。你们看到了我没看到的东西吗? 谢谢。
模板图片:
![enter image description here](https://istack.dev59.com/4bfSI.webp)
![enter image description here](https://istack.dev59.com/tOIx6.webp)
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