如何读取 matchTemplate 的结果(python 中的 OpenCV2)

How to read the result for matchTemplate (OpenCV2 in python)

下面的代码其实就是我马上打印出来的结果:

result = cv.matchTemplate(haystack_img, needle_img, cv.TM_SQDIFF_NORMED

图片尺寸:

不过,我不太明白那是什么意思。

输出给你一个 response 大小为 21 x 10 的图像,其中 7 x 7 needle_img 模板从左到右滑过图像,从上到下提取与模板重合的每个 7 x 7 window 并计算相关性。请注意输出大小的减少。它比搜索图像小,因为假定模板完全适合图像。

但是,您选择的指标是 距离 指标 (cv2.TM_SQDIFF_NORMED)。对于此响应图像中的每个元素,它为您提供了模板与每个 window 之间的差异。给你最小值的位置意味着如果你把模板的左上角放在这个位置,这是模板与图像最匹配的地方。

下面是一些代码,用于在干草堆图像中与模板最匹配的位置绘制边界框:

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 将提供模板最匹配位置左上角的列和行坐标。我们根据模板的尺寸创建右下角坐标,然后创建图像的新副本并在其上绘制一个白色矩形,表明您是最匹配的模板,然后在最后显示图像。

感谢@rayryeng 的回复,再多解释一下~

结果:

  • 位置 (0,0) 置信度为 0.05779364
  • 位置 (0,1) 置信度为 0.03569747

图片尺寸:

  • haystack_img = 27x16
  • needle_img = 7x7

由于图像是按每个像素比较的,所以X和Y位置可以算作

  • X:27-7+1) = 21
  • Y:(16-7+1) = 10

X:0, 1, 2, 3, ... ,21 = 每个列表中的位置 也等于

len(result[0])

[

0.05779364
0.06816062
0.07974802
0.09858147
0.12885822
0.16065261
0.19880965
0.28301606
0.3753051
0.47798595
0.5469872
0.5558993
0.5515625
0.5280534
0.51457506
0.4536102
0.41659155
0.38783583
0.37042123
0.34466013
0.31110483

]

Y:0, 1, 2, 3, 4, 5 = 列表中的位置也等于

len(result)

[

[0.05779364 0.06816062 ...]
[0.03569747 0.03553726 ...]
[0.06887697 0.07845661 ...]
[0.10796931 0.12338859 ...]
[0.15996848 0.18395858 ...]
[0.224204   0.2505653 ...]
[0.3423201  0.37836382 ...]
[0.38187546 0.38226286 ...]
[0.39126304 0.39931965 ...]
[0.39757547 0.4197682 ...]

]

官方文档: https://docs.opencv.org/4.2.0/df/dfb/group__imgproc__object.html#ga586ebfb0a7fb604b35a23d85391329be