OpenCV 模板匹配

目录

一、模板匹配原理

二、实现步骤

[1. 导入库并读取图像](#1. 导入库并读取图像)

[2. 获取模板尺寸](#2. 获取模板尺寸)

[3. 执行模板匹配](#3. 执行模板匹配)

[4. 查找最佳匹配位置](#4. 查找最佳匹配位置)

[5. 绘制匹配区域并显示结果](#5. 绘制匹配区域并显示结果)

三、完整代码

四、注意事项


在计算机视觉领域,模板匹配是一种简单有效的目标检测方法,它可以在一幅图像中快速查找与模板图像相似的区域。本文将基于 OpenCV 库,介绍如何使用模板匹配技术在图像中定位目标。


一、模板匹配原理

模板匹配的基本原理是:将模板图像在待检测图像上滑动,计算模板与图像中每个对应区域的匹配程度,最终找到匹配度最高的区域。

OpenCV 提供了cv2.matchTemplate()函数实现模板匹配,其主要参数如下:

  • image:待搜索的源图像
  • templ:模板图像
  • method:匹配算法,常用的有 6 种:
    • TM_SQDIFF:平方差匹配法(值越小匹配越好)
    • TM_CCORR:相关匹配法(值越大匹配越好)
    • TM_CCOEFF:相关系数匹配法(值越大匹配越好)
    • TM_SQDIFF_NORMED:归一化平方差匹配法
    • TM_CCORR_NORMED:归一化相关匹配法
    • TM_CCOEFF_NORMED:归一化相关系数匹配法(推荐使用)

二、实现步骤

下面通过一个实例演示如何在可乐图像中定位模板图案:

1. 导入库并读取图像

首先需要导入 OpenCV 库,并读取源图像和模板图像:

python 复制代码
import cv2

# 读取源图像和模板图像
kele = cv2.imread('kele.png')
template = cv2.imread('template.png')

# 显示原始图像和模板图像
cv2.imshow('kele', kele)
cv2.imshow('template', template)
cv2.waitKey(0)

2. 获取模板尺寸

获取模板图像的高度和宽度,用于后续绘制匹配区域:

python 复制代码
h, w = template.shape[:2]  # 获取模板的高和宽

3. 执行模板匹配

使用归一化相关系数匹配法进行模板匹配:

python 复制代码
# 执行模板匹配,返回匹配结果矩阵
res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)

4. 查找最佳匹配位置

通过cv2.minMaxLoc()函数找到匹配结果中的最大值(最佳匹配)及其位置:

python 复制代码
# 获取匹配结果中的最值及位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = max_loc  # 最佳匹配区域的左上角坐标

5. 绘制匹配区域并显示结果

根据模板尺寸和最佳匹配位置,绘制矩形框标记匹配区域:

python 复制代码
# 计算匹配区域右下角坐标
bottom_right = (top_left[0] + w, top_left[1] + h)

# 绘制矩形框标记匹配区域
kele_template = cv2.rectangle(kele, top_left, bottom_right, color=(0, 255, 0), thickness=2)

# 显示匹配结果
cv2.imshow('kele_template', kele_template)
cv2.waitKey(0)

三、完整代码

python 复制代码
'''---------------------模板匹配---------------------'''
# cv2.matchTemplate(image, templ, method, result=None, mask=None)
# image:待搜索图像
# templ:模板图像
# method:计算匹配程度的方法,可以有:
#   TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配;匹配越好,值越小;匹配越差,值越大。
#   TM_CCORR 相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
#   TM_CCOEFF 相关系数匹配法:数值越大表明匹配程度越好。
#   TM_SQDIFF_NORMED 归一化平方差匹配法,匹配越好,值越小;匹配越差,值越大。
#   TM_CCORR_NORMED 归一化相关匹配法,数值越大表明匹配程度越好。
#   TM_CCOEFF_NORMED 归一化相关系数匹配法,数值越大表明匹配程度越好。
import cv2

kele = cv2.imread('kele.png')
template = cv2.imread('template.png')
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)  # 返回匹配结果的矩阵
# cv2.minMaxLoc可以获取矩阵中的最小值和最大值,以及最小值的索引号和最大值的索引号
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, top_left, bottom_right, color=(0, 255, 0), thickness=2)  # 绘制矩形

cv2.imshow('kele_template', kele_template)
cv2.waitKey(0)

四、注意事项

  1. 模板图像尺寸应小于源图像尺寸
  2. 不同的匹配方法对光照、旋转等变化的鲁棒性不同,实际应用中需根据场景选择
  3. 归一化的匹配方法(带NORMED后缀)通常效果更好,适用于不同亮度条件
  4. 该方法只能检测与模板方向、尺寸完全一致的目标,对于有旋转或尺度变化的目标需要其他方法
相关推荐
audyxiao001几秒前
人工智能顶级期刊PR论文解读|HCRT:基于相关性感知区域的混合网络,用于DCE-MRI图像中的乳腺肿瘤分割
网络·人工智能·智慧医疗·肿瘤分割
零售ERP菜鸟2 分钟前
IT价值证明:从“成本中心”到“增长引擎”的确定性度量
大数据·人工智能·职场和发展·创业创新·学习方法·业界资讯
叫我:松哥6 分钟前
基于大数据和深度学习的智能空气质量监测与预测平台,采用Spark数据预处理,利用TensorFlow构建LSTM深度学习模型
大数据·python·深度学习·机器学习·spark·flask·lstm
童话名剑1 小时前
目标检测(吴恩达深度学习笔记)
人工智能·目标检测·滑动窗口·目标定位·yolo算法·特征点检测
木卫四科技1 小时前
【木卫四 CES 2026】观察:融合智能体与联邦数据湖的安全数据运营成为趋势
人工智能·安全·汽车
吃茄子的猫6 小时前
quecpython中&的具体含义和使用场景
开发语言·python
珠海西格电力6 小时前
零碳园区有哪些政策支持?
大数据·数据库·人工智能·物联网·能源
じ☆冷颜〃7 小时前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用
笔记·python·深度学习·网络协议·算法·机器学习
数据大魔方7 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
启途AI7 小时前
2026免费好用的AIPPT工具榜:智能演示文稿制作新纪元
人工智能·powerpoint·ppt