如何读取matchTemplate的结果Python中的OpenCV2

问题描述

以下代码实际上是我立即打印出的结果:

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

图片大小:

但是,我真的不明白这意味着什么。

enter image description here

解决方法

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

,

感谢@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