以下代码实际上是我立即打印出的结果:
result = cv.matchTemplate(haystack_img, needle_img, cv.TM_SQDIFF_NORMED
图片尺寸:但是,我真的不明白这意味着什么。
最佳答案
输出为您提供了一个响应图像,其大小为21 x 10,其中7 x 7 needle_img
模板在图像上从左到右,从上到下滑动,并提取了与该模板重合的每个7 x 7窗口,计算相关性。注意输出尺寸的减小。它比搜索图像小,因为假定模板完全适合图像内部。
但是,您选择的度量是距离度量(cv2.TM_SQDIFF_NORMED
)。对于此响应图像中的每个元素,它为您提供了模板和每个窗口之间的差异。赋予最小值的位置意味着,如果将模板的左上角放在此位置,则模板将与图像最匹配。
以下是一些代码,将绘制一个边界框,其中模板在干草堆图像中最匹配:
result = cv2.matchTemplate(haystack_img, needle_img, cv.TM_SQDIFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
top_left = min_loc
w, h = (7, 7)
bottom_right = (top_left[0] + w, top_left[1] + h)
img_to_show = haystack_img.copy()
cv2.rectangle(img_to_show, top_left, bottom_right, 255, 2)
cv2.imshow("Result", img_to_show)
cv2.waitKey(0)
运行模板匹配,然后使用cv2.minMaxLoc
查找最小和最大值以及它们在图像中的位置。给定您正在使用的方法(距离),我们想使用最小值的位置。 min_loc
将提供模板最匹配位置的左上角的列和行坐标。我们根据模板的尺寸创建右下角的坐标,然后创建图像的新副本,并在该图像上绘制一个白色矩形,以表明您是最匹配的模板,然后在最后显示图像。
关于python - 如何读取matchTemplate的结果(Python中的OpenCV2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64084943/