文章目录
一、模板匹配简单介绍
-
在Python中,模板匹配是一种在图像中查找与给定模板最相似区域的技术。
-
模板匹配的基本步骤包括:
- 1.加载图像和模板:首先,你需要加载你想要搜索的图像(通常称为“原图”)和你想要匹配的模板图像。模板图像应该是原图中的一个较小部分。
- 2.执行模板匹配:使用OpenCV的cv2.matchTemplate()函数在原图上滑动模板,并计算每个位置的匹配度。这个函数会返回一个矩阵,其中每个元素表示模板在原图对应位置上的匹配程度。
- 3.查找最佳匹配:使用cv2.minMaxLoc()函数在匹配度矩阵中找到最大值(或最小值,取决于你使用的匹配方法)及其位置。这个位置就是模板在原图中最佳匹配的位置。
- 4.在原图上绘制匹配区域:为了可视化结果,你可以在原图上绘制一个矩形来标记匹配到的区域。
二、三个主要函数的介绍
1.执行模板匹配函数-cv2.matchTemplate()
- result = cv2.matchTemplate(image, template, method, mask=None)
- 参数说明:
- image:要在其中搜索模板的原图像。
- template:要在原图中搜索的模板图像。它应该比原图小。
- method:用于比较模板和原图的区域的匹配方法,OpenCV 提供了几种不同的方法:
- TM_SQDIFF :平方差匹配法:该方法采用平方差来进行匹配;匹配越好,值越小;匹配越差,值越大。
- TM_CCORR :相关匹配法:该方法采用乘法作;数值越大表明匹配程度越好。
- TM_CCOEFF :相关系数匹配法:数值越大表明匹配程度越好。
- TM_SQDIFF_NORMED :归一化平方差匹配法,匹配越好,值越小;匹配越差,值越大。
- TM_CCORR_NORMED :归一化相关匹配法,数值越大表明匹配程度越好。
- TM_CCOEFF_NORMED :归一化相关系数匹配法,数值越大表明匹配程度越好。
- 返回值 result 是一个矩阵,其大小取决于原图和模板的大小以及使用的匹配方法。矩阵中的每个元素都表示模板在原图对应位置上的匹配程度。对于某些方法(如平方差匹配),值越小表示匹配程度越高;而对于其他方法(如相关匹配),值越大表示匹配程度越高。
2.查找最佳匹配函数-cv2.minMaxLoc()
-
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(src, mask=None)
-
参数说明:
- src:输入的二维数组(如灰度图像或匹配结果矩阵)。
- mask:一个与 src 相同大小的掩码图像,用于指定 src 中哪些区域应该被考虑(通常不用)。
-
返回值:
- minVal:数组中的最小值。
- maxVal:数组中的最大值。
- minLoc:最小值的坐标(一个二元组,(x, y))。
- maxLoc:最大值的坐标(一个二元组,(x, y))。
3.在原图上绘制匹配区域函数-cv2.rectangle()
-
cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
-
参数说明:
- img:要在其上绘制矩形的图像。这应该是一个单通道(灰度)图像或三通道(彩色)图像。
- pt1:矩形的一个角的坐标,这是一个二元组(tuple),格式为 (x, y)。
- pt2:矩形对角线上的另一个角的坐标,也是一个二元组,格式为 (x, y)。注意,这个对角线上的点不需要是矩形的右下角或右上角,它只需要与 pt1 形成对角线即可。
- color:矩形的颜色。对于灰度图像,这是一个介于0(黑色)和255(白色)之间的标量。对于彩色图像,这是一个三元组,分别代表蓝色、绿色和红色的强度,值的范围也是从0到255。
- thickness:线条的粗细(可选)。如果设置为 -1,则填充矩形。默认值是 1。
- lineType:线条的类型(可选)。例如,cv2.LINE_8 表示8连接线,cv2.LINE_AA 表示抗锯齿线。如果未指定,则默认为 cv2.LINE_8。
- shift:坐标点和线条粗细的小数位数(可选)。这个参数通常保持为默认值 0。
-
返回绘制好的图片
三、代码实现
import cv2
# 读取原图和标签图
kele = cv2.imread('kele.png')
template = cv2.imread('template.png')
# 显示原图和标签图
cv2.imshow('kele', kele)
cv2.imshow('template', template)
# 进行模板匹配
res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED) # 返回匹配结果的矩阵
# 查找最佳匹配
# cv2.minMaxLoc可以获取矩阵中的最小值和最大值,以及最小值坐标和最大值坐标
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 最佳匹配位置(数组)中的:最小值、最大值、最小值坐标、最大值坐标
top_left = max_loc # 左上角点的坐标就是最大值位置的坐标
h, w = template.shape[:2] # 获取标签图的高和宽
bottom_right = (top_left[0] + w, top_left[1] + h) # 右下角点的坐标
# 绘制矩形
kele_template = cv2.rectangle(kele, top_left, bottom_right, (0, 255, 0), 2)
# 显示绘制后的原图
cv2.imshow('kele_template', kele_template)
# 等待任意键按下后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
- 结果如下