如何在模板匹配中使用 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()的主要内容,如果未能解决你的问题,请参考以下文章