OpenCV-模板匹配

文章目录

一、简介

在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中也提供了多种模板匹配算法,可以根据具体情况来选择合适的算法,但是模板匹配对尺度变换比较敏感,比如我们对模板图像进行放大或者缩小操作后,可能会导致无法找到准确的位置,且因为需要遍历待检测图像中的每一个可能位置,并与模板图像进行比较,所有耗时较大。

相关推荐
企业数字化笔记9 小时前
AI视频增强后画质怎么验收?插值基线、伪细节与帧间闪烁的检查方法
人工智能·算法·音视频
十@八九9 小时前
VS Code 接入 AMD Vivado 2026.1 AI 助手:从 VSIX 到 MCP 实战
人工智能·fpga·vs code·vivado·mcp
Binovate缤江数智9 小时前
电动自行车入户充电如何识别?数智开关与AI负荷识别的社区应用实践
人工智能·物联网
布吉岛的石头9 小时前
Java 程序员第 50 阶段3:数据工程:预训练语料清洗与去重
java·开发语言·人工智能·深度学习·transformer
Yula99339 小时前
从“撰写耗时”到“认知卸载”:企业邮件AI的效率边界与工程化路径
人工智能·神经网络·机器学习·数据挖掘·系统安全·信息与通信
橙色云-智橙协同研发9 小时前
核心Know-How不再随人走——智橙AI“智淀“功能详解
大数据·人工智能·ai
武子康9 小时前
Vercel Cache Reason:相同 MISS,怎样决定下一步查什么
人工智能·后端·agent
4SAPI9 小时前
内容生成与文本润色场景下的大模型 API 聚合网关选型指南
人工智能·gateway·php
诸神缄默不语9 小时前
小春学习日刊 2026年第7期:2026.10.24
人工智能