如何读取 matchTemplate 的结果(python 中的 OpenCV2)
How to read the result for matchTemplate (OpenCV2 in python)
下面的代码其实就是我马上打印出来的结果:
result = cv.matchTemplate(haystack_img, needle_img, cv.TM_SQDIFF_NORMED
图片尺寸:
- haystack_img = 27x16
- needle_img = 7x7
不过,我不太明白那是什么意思。
输出给你一个 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
下面的代码其实就是我马上打印出来的结果:
result = cv.matchTemplate(haystack_img, needle_img, cv.TM_SQDIFF_NORMED
图片尺寸:
- haystack_img = 27x16
- needle_img = 7x7
不过,我不太明白那是什么意思。
输出给你一个 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