1.什么是模板匹配
模板匹配是一种用于查找与模板图像(补丁)匹配(相似)的图像区域的技术。
具体来说,模板匹配需要准备两张图:一张是源图像(也叫输入图像) ,也就是我们要从中寻找目标的完整大图;另一张是模板图像,也就是我们要找的目标物体的单独截图。算法会将模板图像像一个 "滑动窗口" 一样,在源图像上从左到右、从上到下依次滑动遍历,每滑动到一个位置,就会通过特定的计算方法,判断该位置的图像与模板图像的匹配程度,最终找到匹配程度最高的位置,也就是目标物体在源图像中的所在之处。
2.例子
读取图像文件并显示
python
# 读取源图像(大图)
kele = cv2.imread(r"C:\Users\LEGION\Desktop\fcea1b9725d1a0aff1ea41d925fbf14a.png")
# 读取模板图像(要寻找的小目标图)
template = cv2.imread(r"C:\Users\LEGION\Desktop\efe68a20282e52dfbc1141e0adfce72a.png")
cv2.imshow( 'kele',kele)
cv2.imshow( 'template',template)
cv2.waitKey(0)
注意:
函数返回值是一个三维 NumPy 数组(对于彩色图像),数组的形状为(高度,宽度,通道数),其中通道数默认是 3(BGR 格式,这是 OpenCV 的默认图像格式,与我们常见的 RGB 格式顺序不同)。
运行结果:

就是有一个左上角显示的图片(模板图像),我们将把它与源图像(大图)进行模板匹配
获取模板图像的尺寸
python
# 获取模板图像的高度(h)和宽度(w),shape[:2]表示取前两个维度(高度、宽度)
h, w = template.shape[:2]
注释:
-
对于彩色图像,
template.shape返回的是(h, w, 3),其中h是图像的高度(对应矩阵的行数),w是图像的宽度(对应矩阵的列数),3 是通道数。 -
我们使用
shape[:2]截取前两个维度,即可快速获取模板图像的高度和宽度,赋值给变量h和w,为后续绘制矩形框做准备。
执行模板匹配算法
python
res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)
#返回匹配结果的矩阵,其中每个元素表示该位置与模板的匹配程度
#cv2.minMaxLoc可以获取矩阵中的最小值和最大值,以及最小值的索引号和最大值的索引号
注释:
-
cv2.matchTemplate()函数有三个核心参数:-
第一个参数:源图像(大图),即我们要从中寻找目标的图像。
-
第二个参数:模板图像(小图),即我们要寻找的目标图像,其尺寸必须小于或等于源图像的尺寸。
-
第三个参数:匹配方法(模板匹配的计算准则),OpenCV 提供了 6 种常用的匹配方法,本次使用的
cv2.TM_CCOEFF_NORMED是归一化的相关系数匹配方法,也是实际应用中最常用的方法之一,其匹配结果值的范围在[-1, 1]之间,值越接近 1,表示匹配程度越高。
-
-
函数的返回值
res是一个二维 NumPy 数组(匹配结果矩阵),其形状为(H - h + 1, W - w + 1),其中H和W是源图像的高度和宽度,h和w是模板图像的高度和宽度。
寻找最佳匹配位置
得到匹配结果矩阵后,我们需要从中找到匹配程度最高的位置,这里使用cv2.minMaxLoc()函数,该函数可以快速获取矩阵中的最小值、最大值,以及对应的坐标位置。
python
# 从匹配结果矩阵中获取最小值、最大值,以及对应的坐标位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
-
cv2.minMaxLoc()函数的参数是一个二维数组(匹配结果矩阵res),返回值是一个元组,包含四个元素,依次是:-
min_val:矩阵中的最小值。 -
max_val:矩阵中的最大值。 -
min_loc:最小值对应的坐标位置(元组类型,格式为(x, y),对应图像的列和行,即宽度和高度方向)。 -
max_loc:最大值对应的坐标位置(格式同上)。
-
-
由于我们使用的是
cv2.TM_CCOEFF_NORMED归一化相关系数匹配方法,匹配程度越高,值越接近 1,因此最佳匹配位置就是max_loc对应的坐标,这个坐标是模板图像在源图像中最佳匹配区域的左上角坐标。 -
注意:不同的匹配方法,最佳匹配位置对应的是最小值还是最大值有所不同。例如
cv2.TM_SQDIFF(平方差匹配方法),值越接近 0 匹配程度越高,此时最佳匹配位置就是min_loc对应的坐标。
计算匹配区域的右下角坐标
python
# 最佳匹配区域的左上角坐标
top_left = max_loc
# 计算最佳匹配区域的右下角坐标:左上角x+模板宽度,左上角y+模板高度
bottom_right = (top_left[0] + w, top_left[1] + h)
绘制矩形框标记目标区域
python
# 在源图像上绘制绿色矩形框,标记最佳匹配区域
kele_template = cv2.rectangle(kele, top_left, bottom_right, (0, 255, 0), 2)
cv2.rectangle()函数用于在图像上绘制矩形,核心参数说明:
-
第一个参数:要绘制矩形的目标图像(这里是源图像
kele)。 -
第二个参数:矩形的左上角坐标(
top_left)。 -
第三个参数:矩形的右下角坐标(
bottom_right)。 -
第四个参数:矩形的颜色,格式为
(B, G, R)(OpenCV 默认图像格式为 BGR),这里(0, 255, 0)表示绿色。 -
第五个参数:矩形边框的宽度(单位:像素),传入正数表示绘制空心矩形,传入 - 1 表示绘制实心矩形(填充整个矩形区域)。
注意:该函数会直接在传入的图像上进行修改,同时也会返回修改后的图像矩阵,这里我们将返回值赋值给kele_template,用于后续显示匹配结果。
显示匹配结果
python
# 显示标记了匹配区域的图像
cv2.imshow('kele_template', kele_template)
# 等待用户按键,关闭窗口
cv2.waitKey(0)
运行结果:
