如何在模板匹配中使用 cv2.minMaxLoc()

Posted

技术标签:

【中文标题】如何在模板匹配中使用 cv2.minMaxLoc()【英文标题】:How to use the cv2.minMaxLoc() in template matching 【发布时间】:2018-11-14 02:05:38 【问题描述】:

这是我用于模板匹配的代码,min_val、max_val、min_loc、max_loc 是什么意思?它们是用来做什么的?

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('C:\\machineLearning\\positive\\1.jpg', 0)
img2 = img.copy()
template = cv2.imread('C:\\machineLearning\\positive\\1_.jpg', 0)
w, h = template.shape[::-1]

img = img2.copy()
method = eval('cv2.TM_SQDIFF')

res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

top_left = min_loc
bottom_right = (top_left[0] + w, top_left[1] + h)

cv2.rectangle(img,top_left, bottom_right, 255, 2)

plt.subplot(121),plt.imshow(res,cmap = 'gray')
plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img,cmap = 'gray')
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.suptitle('cv2.TM_SQDIFF')

plt.show()

【问题讨论】:

min_val == 最小值,max_val == 最大值,min_loc == 最小值的位置(来自输入图像的坐标) max_loc == 最大值的位置(来自输入图像的坐标)您可以通过在 Python 解释器中执行 help(cv2.minMaxLoc) 来确认这一点。在您给出的代码示例中, min_loc 用于设置感兴趣区域边界框的上角。其他变量似乎没有使用。 min_val = 最小值,我肯定知道,我懂英文,我问的是最小值的意思 如文档 (docs.opencv.org/master/d2/de8/…) 中所写,最小值是全局最小值(也就是所有矩阵值中的最小值)。 这意味着什么?例如如果我使用TM_SQDIFF,最小值是否表示匹配量? 查看 matchTemplate 函数的文档。如果(且仅当)变量“res”确实包含平方差的结果(并且只有那个),所以是的,最小值将是全局最小平方差。如果变量确实包含受平方差影响但不是平方差的东西,那么解释与存储在 res 中的信息有关。您可以在文档中轻松找到此信息。请务必检查文档。 【参考方案1】:

如果通过cv2.matchTemplate()docs,该函数返回一个模糊单通道矩阵,其中包含模板和输入图像片段的匹配分数。对于cv2.TM_CCOEFF 方法,得分最高的点会最亮,但在cv2.TM_SQDIFF_NORMED 方法的情况下,得分最高的点会最暗

cv2.TM_CCOEFF 结果:

cv2.TM_SQDIFF_NORMED 结果:

因此,根据可用的各种方法,您有时可能需要获取输出矩阵中的最亮点或最暗点。 cv2.minMaxLoc() 只是这两个通用操作的统一,当您使用minMaxLoc 时,您可以忽略min 属性。

【讨论】:

谢谢,因为我使用 TM_SQDIFF 方法,我需要考虑最小属性对吗?最暗点是什么意思?这是最好的比赛吗?如果它变得更小,检测更准确?如果它变得更大的值,检测会更不准​​确? 没错 :) (y)

以上是关于如何在模板匹配中使用 cv2.minMaxLoc()的主要内容,如果未能解决你的问题,请参考以下文章

使用Python,OpenCV进行模板匹配单对象多对象及多尺度模板匹配

如何在模板匹配中找到 ROI 内对象的旋转?

如何在模板匹配代码中获得结果?

如何在 7 段图像上正确进行模板匹配?

OpenCV模板匹配 - 如何确定匹配模板的角度

如何计算模板匹配检测到的对象数量?