当前位置: 首页 > news >正文

基于 OpenCV 的模板匹配技巧实例

文章目录

    • 一、模板匹配概述
    • 二、核心函数解析
      • 1. matchTemplate函数
      • 2. 匹配方法详解
    • 三、完整代码实现与分析
    • 四、关键步骤解析
      • 1. 图像读取与显示
      • 2. 模板尺寸获取
      • 3. 匹配结果分析
      • 4. 结果可视化


一、模板匹配概述

模板匹配是一种在图像中寻找与给定模板图像相似区域的技术。OpenCV 提供了cv2.matchTemplate()函数来实现这一功能,它通过滑动模板图像到待搜索图像上,计算每个位置的相似度,从而找到最佳匹配位置。
在这里插入图片描述
在这里插入图片描述

二、核心函数解析

1. matchTemplate函数

cv2.matchTemplate(image, temp1, method, result=None, mask=None)

参数说明:

  • image:待搜索图像(大图)
  • temp1:模板图像(小图)
  • method:匹配方法,决定了如何计算相似度
  • result:可选参数,存储匹配结果的矩阵
  • mask:可选参数,指定模板的掩码区域

2. 匹配方法详解

OpenCV提供了六种匹配方法,每种方法都有其特点和适用场景:

# TM_SQUIFF 平方差匹配法,该方法采用平方差来进行匹配;匹配越好,值越小;匹配越差,值越大。
# TM_CCORR 相关匹配法,该方法采用乘法操作;数值越大表明匹配程度越好。
# TM_CCOEFF 相关系数匹配法,数值越大表明匹配程度越好。
# TM_SQUIFF_NORMED 归一化平方差匹配法,匹配越好,值越小;匹配越差,值越大。
# TM_CCORR_NORMED 归一化相关匹配法,数值越大表明匹配程度越好。
# TM_CCOEFF_NORMED 归一化相关系数匹配法,数值越大表明匹配程度越好。

方法分类:

  1. 平方差匹配法(TM_SQDIFF)

    • 基于像素值差的平方和
    • 完全匹配时值为0
    • 值越小匹配越好
  2. 相关匹配法(TM_CCORR)

    • 基于模板和图像间的乘法操作
    • 数值越大表示匹配越好
    • 对亮度变化敏感
  3. 相关系数匹配法(TM_CCOEFF)

    • 基于模板和图像间的相关系数
    • 考虑均值和标准差
    • 对亮度变化不敏感
  4. 归一化版本(_NORMED后缀)

    • 将结果归一化到[0,1]或[-1,1]范围
    • 对图像尺寸和亮度变化更鲁棒
    • 推荐在实际应用中使用

三、完整代码实现与分析

import cv2
# 1. 读取图像
kele = cv2.imread('kele.png')
template = cv2.imread('template.png')
# 显示原始图像
cv2.imshow('kele', kele)
cv2.imshow('template', template)
cv2.waitKey(0)
# 2. 获取模板尺寸
h, w = template.shape[:2]
# 3. 执行模板匹配
# 使用归一化相关系数匹配法
# 返回一个矩阵,每个元素表示该位置与模板的匹配程度
res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)
# 4. 分析匹配结果
# minMaxLoc获取矩阵中的极值信息
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# 对于TM_CCOEFF_NORMED方法,最大值位置是最佳匹配
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
# 5. 绘制匹配区域
kele_template = cv2.rectangle(kele, top_left, bottom_right, (0, 255, 0), 2)
# 显示结果
cv2.imshow('kele_template', kele_template)
cv2.waitKey(0)

四、关键步骤解析

1. 图像读取与显示

2. 模板尺寸获取

  • template.shape[:2]获取模板的高度和宽度
  • 用于后续计算匹配区域的范围

3. 匹配结果分析

注意:不同匹配方法的最优值位置不同:

4. 结果可视化

  • cv2.rectangle()在图像上绘制矩形框
  • 参数说明:
    • 第一个参数:目标图像
    • 第二个参数:矩形左上角坐标
    • 第三个参数:矩形右下角坐标
    • 第四个参数:颜色(B,G,R格式)
    • 第五个参数:线宽

在这里插入图片描述

http://www.jsqmd.com/news/375217/

相关文章:

  • 题解:P14614 [2019 KAIST RUN Fall] Bigger Sokoban 40k
  • 鸿蒙架构师修炼之道-如何成为团队的架构师
  • 全链路Token智控,「秒云Tokens管家」解锁AI工程优化新范式
  • MIAOYUN | 每周AI新鲜事儿 260212
  • 用 Go 实现一个可长期运行的 GitHub Webhook 服务实践
  • wpf自适应布局
  • 理性愉悦:分块套 NTT
  • 手搓一个Clawdbot
  • Markdown语法学习笔记2.1对字体设置斜体、粗体、删除线
  • 软件架构能力和任务分解编排能力是Ai大浪潮下的核心技能
  • 比尼德斯实业有限公司是干嘛的?文登教育
  • 在python 3.14 容器中安装和使用chdb包
  • Markdown语法学习笔记1快捷键
  • 小白从零开始勇闯人工智能:机器学习初级篇(PCA素材降维)
  • 题解:P15206 [SWERC 2018] Dishonest Driver
  • 题解:AT_pakencamp_2024_day1_c One Half
  • Burp Suite 入门文档(官方翻译)
  • PyTorch项目合集一
  • springboot民宿管理系统--附源码32900 - 详解
  • 免费城市夜景视频素材网站推荐
  • TikTok Shop东南亚2026退货新规来袭!海外仓这样布局抢占先机
  • 完整教程:MySQL数据可视化实战:从查询到图表全攻略
  • 面向大模型开发:在项目中使用 TOON 的实践与流式处理深度解析:原理、实战与踩坑记录
  • 3:【GitHub连接】Connection timed out port 22 → 改用443端口SSH(公司/校园网2026常见)
  • 探索 LDO 电路:模拟集成电路设计的实践之旅
  • 2:【新手最坑】git push HTTPS vs SSH反复失败怎么彻底统一
  • 4:【Git clone】fatal: unable to access / timeout / proxy设置
  • 如何在大数据领域运用 OLAP 提升业务洞察
  • 写论文是看完一堆文献后再写,还是边看边写
  • P10720 [GESP202406 五级] 小杨的幸运数字 欧拉筛