文章目录
一、简介
在OpenCV中,模型匹配(或称为模板匹配)是一种用于在图像中查找与给定模板最相似区域的技术。OpenCV提供了cv2.matchTemplate()函数来实现模板匹配。这个函数通过滑动模板图像在输入图像上来比较模板和每个可能的窗口区域,并计算它们之间的相似度。
1.定义与原理
模板匹配是一种最原始、最基本的模式识别方法,其核心在于通过已知的小图像(模板)在另一幅大图像中搜寻相同或相似的目标物,并确定其位置。这一过程主要依赖于计算模板图像与待搜索图像中各个区域的相似度。
2.算法与方法
模板匹配算法通常包括以下几个步骤:
读取图像和模板:首先,你需要读取包含要搜索对象的图像(称为输入图像)以及你想要匹配的模板图像。
执行模板匹配:使用cv2.matchTemplate()函数在输入图像上搜索与模板最相似的区域。
查找最佳匹配:通过比较cv2.matchTemplate()函数返回的相似度图,找到与模板最匹配的区域。这通常是通过找到相似度图中的最大值(或最小值,取决于你使用的匹配方法)来完成的。
提取匹配区域:一旦找到最佳匹配的位置,你可以从原始图像中提取该区域的图像。
3.参数解释
result = cv2.matchTemplate(image, templ, method, result=None, mask=None)
- image:输入图像,需要是8位或32位浮点型。
- templ:模板图像,大小和类型与输入图像相同。
- method:指定匹配方法的标志。OpenCV提供了几种不同的方法,如下:
- TM_SQDIFE平方差匹配法:该方法采用平方差来进行匹配;匹配越好,值越小;匹配越差,值越大。
- TN_CCORR相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
- TN_CCOEFF相关系数匹配法:数值越大表明匹配程度越好。
- TN_SQDIFF_NORMED归一化平方差匹配法,匹配越好,值越小;匹配越差,值越大。
- TN_CCORR_NORMED归一化相关匹配法,数值越大表明匹配程度越好。
- TN_CCOEFF_NORMED归一化相关系数匹配法,数值越大表明匹配程度越好。
- result:匹配结果存储在这个矩阵中,类型为32位浮点数。如果未提供,则自动创建。
- mask:模板的掩码。只有当模板掩码中的相应元素非零时,才考虑模板或输入图像中的这些元素。
二、代码实现
1.读取数据
python
import cv2
# 读取图像和模板
kele = cv2.imread('kl.png')
template = cv2.imread('template.png')
- 使用cv2.imread()函数读取名为'kl.png'的图像文件,并将其存储在变量kele中,同样地,读取名为'template.png'的模板图像文件,并将其存储在变量template中
2.检查图像是否成功加载
python
if kele is None or template is None:
print("Error: Unable to load images.")
else:
# 显示原始图像和模板
cv2.imshow('kele', kele)
cv2.imshow('template', template)
cv2.waitKey(0)
- 检查kele和template变量是否为None,即检查图像是否成功加载,如果任一图像未成功加载,则打印错误信息。
- 如果图像成功加载,则显示原始图像和模板。
3.获取模板的高度和宽度
python
h, w = template.shape[:2]
- 使用shape属性获取模板图像的高度和宽度,并分别存储在h和w中。
4.模板匹配
python
res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
- 在kele图像上搜索与template模板最相似的区域,使用归一化相关系数匹配方法。
- 使用cv2.minMaxLoc()函数找到res矩阵中的最小值和最大值及其位置。
5.计算匹配区域坐标
python
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
kele_template = cv2.rectangle(kele.copy(), top_left, bottom_right, (0, 255, 0), 2)
- 匹配区域的左上角坐标,并根据模板的宽度和高度计算匹配区域的右下角坐标。
- 在kele图像的副本上绘制矩形,并设置颜色为绿色(0, 255, 0),线宽为2
6.显示图像
python
cv2.imshow('kele_template', kele_template)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 显示带有矩形标记的kele图像副本,窗口标题为'kele_template'
7.全部代码
python
import cv2
# 读取图像和模板
kele = cv2.imread('kl.png')
template = cv2.imread('template.png')
# 检查图像是否成功加载
if kele is None or template is None:
print("Error: Unable to load images.")
else:
# 显示原始图像和模板
cv2.imshow('kele', kele)
cv2.imshow('template', template)
cv2.waitKey(0)
# 获取模板的高度和宽度
h, w = template.shape[:2]
# 执行模板匹配
res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)
# 查找最佳匹配(即相似度最高的位置)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# 计算匹配区域的左上角和右下角坐标
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
# 在原始图像上绘制矩形以标记匹配区域
kele_template = cv2.rectangle(kele.copy(), top_left, bottom_right, (0, 255, 0), 2)
# 显示带有匹配区域的图像
cv2.imshow('kele_template', kele_template)
cv2.waitKey(0)
# 清理所有OpenCV窗口
cv2.destroyAllWindows()
这段代码展示了如何使用OpenCV进行模板匹配,并在原始图像上标记出匹配的区域。首先检查图像是否成功加载,然后显示原始图像和模板,执行模板匹配,找到最佳匹配位置,并在原始图像的副本上绘制矩形以标记该位置。最后,显示带有匹配区域的图像并关闭所有窗口。
三、总结
OpenCV中的模板匹配是一种在图像中寻找与给定模板最相似区域的方法。改方法相对简单,比较容易理解和实现,同时也可以应用于多种场景,如物体检测、图像识别、图像处理等领域,并且OpenCV中也提供了多种模板匹配算法,可以根据具体情况来选择合适的算法,但是模板匹配对尺度变换比较敏感,比如我们对模板图像进行放大或者缩小操作后,可能会导致无法找到准确的位置,且因为需要遍历待检测图像中的每一个可能位置,并与模板图像进行比较,所有耗时较大。