在OpenCV中,模板匹配是一种在图像中寻找指定模板的技术。它可以帮助我们在一幅图像中找到与给定模板最相似的区域。
一般模板匹配
cv.matchTemplate()函数用于在图像中执行模板匹配操作。它采用两个参数:原始图像和模板图像,并返回一个匹配结果的矩阵。它的语法如下:
result = cv.matchTemplate(image, template, method[, result[, mask]])
参数说明:
- image:原始图像,可以是灰度图像或彩色图像。
- template:模板图像,必须与原始图像具有相同的数据类型和通道数。
- method:模板匹配方法,指定不同的比较方式。常用的方法有:
- cv.TM_SQDIFF:平方差匹配方法。
- cv.TM_SQDIFF_NORMED:归一化平方差匹配方法。
- cv.TM_CCORR:相关性匹配方法。
- cv.TM_CCORR_NORMED:归一化相关性匹配方法。
- cv.TM_CCOEFF:相关系数匹配方法。
- cv.TM_CCOEFF_NORMED:归一化相关系数匹配方法。
- 如果方法是TM_SQDIFF或TM_SQDIFF_NORMED,则取最小值
- result(可选):输出的匹配结果矩阵,大小为(W-w+1, H-h+1),其中(W, H)是原始图像的大小,(w, h)是模板图像的大小。
- mask(可选):用于指定感兴趣区域的掩码图像,与原始图像和模板图像具有相同的大小。
返回值:
- 如果省略了result参数,则返回一个包含匹配结果的矩阵。
- 如果指定了result参数,则将匹配结果存储在result中,并返回None。
注意:
- image和template必须具有相同的数据类型(通常为uint8或float32)和通道数。
- template的大小通常应小于或等于image的大小,否则可能无法找到匹配。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('pic1.jpg', 0)
img2 = img.copy()
template = cv.imread('template.jpg', 0)
w, h = template.shape[::-1]
# 列表中所有的6种比较方法
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR',
'cv.TM_CCORR_NORMED', 'cv.TM_SQDIFF', 'cv.TM_SQDIFF_NORMED']
for meth in methods:
img = img2.copy()
method = eval(meth)
# 应用模板匹配
res = cv.matchTemplate(img, template, method)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
# 如果方法是TM_SQDIFF或TM_SQDIFF_NORMED,则取最小值
if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv.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(meth)
plt.show()
以上是较为准确的结果
多对象的模板匹配
搜索具有多次出现的对象时,cv.minMaxLoc()不会为您提供所有位置。在这种情况下,我们将使用阈值化。
与之前的示例类似,但是不再使用cv.minMaxLoc()函数。相反,它直接使用了阈值化方法来筛选匹配结果,并获取满足阈值条件的位置坐标。
threshold = 0.8
loc = np.where( res >= threshold)
在这个示例中,我们设置了一个阈值为0.8,对应于匹配结果的相似度。然后,使用np.where()函数找到满足阈值条件的坐标位置,并在原始图像上绘制矩形框来标记匹配到的对象。