opencv 模板匹配方法汇总
在OpenCV中,模板匹配是一种在较大图像中查找特定模板图像位置的技术。OpenCV提供了多种模板匹配方法,通过cv2.matchTemplate
函数实现,该函数支持的匹配方式主要有以下6种,下面详细介绍每种方法的原理、特点和适用场景。
1. cv2.TM_SQDIFF
(平方差匹配法)
- 原理:计算模板与图像中每个可能位置的像素值平方差的总和。匹配结果值越小,表示匹配程度越高。
- 特点:对光照变化比较敏感,因为它直接比较像素值的差异。
- 公式: R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) − I ( x + x ′ , y + y ′ ) ) 2 R(x,y)=\sum _{x',y'} (T(x',y') - I(x + x',y + y'))^2 R(x,y)=∑x′,y′(T(x′,y′)−I(x+x′,y+y′))2,其中 T T T 是模板图像, I I I 是输入图像, R R R 是匹配结果图像。
- 适用场景:适用于模板和目标图像的光照条件较为一致的情况。
2. cv2.TM_SQDIFF_NORMED
(归一化平方差匹配法)
- 原理:是
cv2.TM_SQDIFF
的归一化版本,将平方差结果归一化到 [0, 1] 范围内。匹配结果值越接近 0,表示匹配程度越高。 - 特点:对光照变化有一定的鲁棒性,因为归一化操作减少了不同图像之间像素值范围差异的影响。
- 适用场景:当模板和目标图像的光照有一定差异,但差异不是特别大时适用。
3. cv2.TM_CCORR
(相关性匹配法)
- 原理:计算模板与图像中每个可能位置的像素值相关性。匹配结果值越大,表示匹配程度越高。
- 特点:对光照变化也比较敏感,因为它直接依赖于像素值的相关性。
- 公式: R ( x , y ) = ∑ x ′ , y ′ ( T ( x ′ , y ′ ) ⋅ I ( x + x ′ , y + y ′ ) ) R(x,y)=\sum _{x',y'} (T(x',y') \cdot I(x + x',y + y')) R(x,y)=∑x′,y′(T(x′,y′)⋅I(x+x′,y+y′))
- 适用场景:适用于模板和目标图像的光照条件较为一致,且模板和目标之间的亮度模式相似的情况。
4. cv2.TM_CCORR_NORMED
(归一化相关性匹配法)
- 原理:是
cv2.TM_CCORR
的归一化版本,将相关性结果归一化到 [0, 1] 范围内。匹配结果值越接近 1,表示匹配程度越高。 - 特点:对光照变化有较好的鲁棒性,因为归一化操作消除了不同图像之间像素值范围差异的影响。
- 适用场景:在光照条件不稳定的情况下,是一种比较常用的匹配方法。
5. cv2.TM_CCOEFF
(相关系数匹配法)
- 原理:计算模板与图像中每个可能位置的像素值相关系数。匹配结果值越大,表示匹配程度越高。相关系数衡量的是两个信号之间的线性相关性。
- 特点:对光照变化有一定的鲁棒性,因为它考虑了模板和图像的均值。
- 适用场景:适用于模板和目标图像的光照有一定差异,但整体结构相似的情况。
6. cv2.TM_CCOEFF_NORMED
(归一化相关系数匹配法)
- 原理:是
cv2.TM_CCOEFF
的归一化版本,将相关系数结果归一化到 [-1, 1] 范围内。匹配结果值越接近 1,表示匹配程度越高。 - 特点:对光照变化具有较强的鲁棒性,是一种比较稳定的匹配方法。
- 适用场景:在各种光照条件下都能有较好的表现,是最常用的模板匹配方法之一。
代码示例
import cv2
import numpy as np# 读取图像和模板
img = cv2.imread('image.jpg', 0)
template = cv2.imread('template.jpg', 0)
h, w = template.shape[:2]# 定义匹配方法
methods = ['cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED', 'cv2.TM_CCORR','cv2.TM_CCORR_NORMED', 'cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED']for meth in methods:img2 = img.copy()method = eval(meth)# 执行模板匹配res = cv2.matchTemplate(img2, template, method)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)# 根据不同的匹配方法确定最佳匹配位置if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:top_left = min_locelse:top_left = max_locbottom_right = (top_left[0] + w, top_left[1] + h)# 在图像上绘制矩形框标记匹配位置cv2.rectangle(img2, top_left, bottom_right, 255, 2)# 显示结果cv2.imshow(meth, img2)cv2.waitKey(0)
cv2.destroyAllWindows()
这个示例代码展示了如何使用不同的模板匹配方法在图像中查找模板的位置,并在图像上绘制矩形框标记匹配结果。你可以根据实际需求选择合适的匹配方法。
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;// 定义模板匹配方法名称和对应的枚举值
const char* method_names[] = { "TM_SQDIFF", "TM_SQDIFF_NORMED", "TM_CCORR","TM_CCORR_NORMED", "TM_CCOEFF", "TM_CCOEFF_NORMED" };
const int methods[] = { TM_SQDIFF, TM_SQDIFF_NORMED, TM_CCORR,TM_CCORR_NORMED, TM_CCOEFF, TM_CCOEFF_NORMED };int main()
{// 读取图像和模板Mat img = imread("image.jpg", IMREAD_GRAYSCALE);Mat template_img = imread("template.jpg", IMREAD_GRAYSCALE);if (img.empty() || template_img.empty()){cout << "Could not open or find the image or template" << endl;return -1;}int h = template_img.rows;int w = template_img.cols;// 遍历不同的匹配方法for (int i = 0; i < 6; i++){Mat img2 = img.clone();Mat result;// 执行模板匹配matchTemplate(img2, template_img, result, methods[i]);double minVal, maxVal;Point minLoc, maxLoc;// 查找匹配结果中的最小值和最大值以及它们的位置minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);Point topLeft;bool isMatch = false;// 根据不同的匹配方法确定最佳匹配位置,并判断是否匹配成功if (methods[i] == TM_SQDIFF || methods[i] == TM_SQDIFF_NORMED){topLeft = minLoc;if (methods[i] == TM_SQDIFF_NORMED && minVal < 0.1) // 可调整阈值{isMatch = true;}}else if (methods[i] == TM_CCORR_NORMED && maxVal > 0.8) // 可调整阈值{topLeft = maxLoc;isMatch = true;}else if (methods[i] == TM_CCOEFF_NORMED && maxVal > 0.8) // 可调整阈值{topLeft = maxLoc;isMatch = true;}if (isMatch){Point bottomRight(topLeft.x + w, topLeft.y + h);// 在图像上绘制矩形框标记匹配位置rectangle(img2, topLeft, bottomRight, Scalar(255), 2);}else{cout << "No match found using " << method_names[i] << endl;}// 显示结果imshow(method_names[i], img2);}waitKey(0);destroyAllWindows();return 0;
}
相关文章:

opencv 模板匹配方法汇总
在OpenCV中,模板匹配是一种在较大图像中查找特定模板图像位置的技术。OpenCV提供了多种模板匹配方法,通过cv2.matchTemplate函数实现,该函数支持的匹配方式主要有以下6种,下面详细介绍每种方法的原理、特点和适用场景。 1. cv2.T…...

Embedding技术:DeepWalkNode2vec
引言 在推荐系统中,Graph Embedding技术已经成为一种强大的工具,用于捕捉用户和物品之间的复杂关系。本文将介绍Graph Embedding的基本概念、原理及其在推荐系统中的应用。 什么是Graph Embedding? Graph Embedding是一种将图中的节点映射…...

微信小程序注册组件
在微信小程序中注册组件分为自定义组件的创建和全局/局部注册,下面为你详细介绍具体步骤和示例。 自定义组件的创建 自定义组件由四个文件组成,分别是 .js(脚本文件)、.json(配置文件)、.wxml(…...

【docker】安装mysql,修改端口号并重启,root改密
我的docker笔记 【centOS】安装docker环境,替换国内镜像 1. 配置镜像源 使用阿里云镜像加速器,编辑/etc/docker/daemon.json sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https:/…...

自定义wordpress三级导航菜单代码
首先,在你的主题functions.php文件中,添加以下代码以注册一个新的菜单位置: function mytheme_register_menus() {register_nav_menus(array(primary-menu > __(Primary Menu, mytheme))); } add_action(init, mytheme_register_menus); …...

洛谷 P1480 A/B Problem(高精度详解)c++
题目链接:P1480 A/B Problem - 洛谷 1.题目分析 1:说明这里是高精度除以低精度的形式,为什么不是高精度除以高精度的形式,是因为它很少见,它的模拟方式是用高精度减法来做的,并不能用小学列竖式的方法模拟…...

JAVA入门——网络编程简介
自己学习时的笔记,可能有点水( 以后可能还会补充(大概率不会) 一、基本概念 网络编程三要素: IP 设备在网络中的唯一标识 端口号 应用软件在设备中的唯一标识两个字节表示的整数,0~1023用于知名的网络…...

Ubuntu 合上屏幕 不待机 设置
有时候需要Ubuntu的机器合上屏幕的时候也能正常工作,而不是处于待机状态。 需要进行配置文件的设置,并重启即可。 1. 修改配置文件 /etc/systemd/logind.conf sudo vi /etc/systemd/logind.conf 然后输入i,进入插入状态,修改如…...

捣鼓180天,我写了一个相册小程序
🙋为什么要做土著相册这样一个产品? ➡️在高压工作之余,我喜欢浏览B站上的熊猫幼崽视频来放松心情。有天在家族群里看到了大嫂分享的侄女卖萌照片,同样感到非常解压。于是开始翻阅过去的聊天记录,却发现部分图片和视…...

短分享-Flink图构建
一、背景 通过简单的书写map、union、keyby等代码,Flink便能构建起一个庞大的分布式计算任务,Flink如何实现的这个酷炫功能呢?我们本次分享Flink做的第一步,将代码解析构建成图 源码基于Flink 2.10,书籍参考《Flink核…...

【监督学习】支持向量机步骤及matlab实现
支持向量机 (四)支持向量机1.算法步骤2. MATLAB 实现参考资料 (四)支持向量机 支持向量机(Support Vector Machine, SVM)是一种用于分类、回归分析以及异常检测的监督学习模型。SVM特别擅长处理高维空间的…...

机器学习-随机森林解析
目录 一、.随机森林的思想 二、随机森林构建步骤 1.自助采样 2.特征随机选择 3构建决策树 4.集成预测 三. 随机森林的关键优势 **(1) 减少过拟合** **(2) 高效并行化** **(3) 特征重要性评估** **(4) 耐抗噪声** 四. 随机森林的优缺点 优点 缺点 五.…...

Javaweb后端spring事务管理 事务四大特性ACID
2步操作,只能同时成功,同时失败,要放在一个事务中,最后提交事务或者回滚事务 事务控制 事务管理进阶 事务的注解 这是所有异常都会回滚 事务注解 事务的传播行为 四大特性...

在Spring Boot + MyBatis中优雅处理多表数据清洗:基于XML的配置化方案
问题背景 在实际业务中,我们常会遇到数据冗余问题。例如,一个公司表(sys_company)中存在多条相同公司名的记录,但只有一条有效(del_flag0),其余需要删除。删除前需将关联表…...

【无标题】四色拓扑模型与宇宙历史重构的猜想框架
### 四色拓扑模型与宇宙历史重构的猜想框架 --- #### **一、理论基础:四色拓扑与时空全息原理的融合** 1. **宇宙背景信息的拓扑编码** - **大尺度结构网络**:将星系团映射为四色顶点,纤维状暗物质结构作为边,构建宇宙尺度…...

[特殊字符] Django 常用命令
🚀 Django 常用命令大全:从开发到部署 Django 提供了许多实用的命令,可以用于 数据库管理、调试、测试、用户管理、运行服务器、部署 等。 本教程将详细介绍 Django 开发中最常用的命令,并提供 示例,帮助你更高…...

mysql中如何保证没有幻读发生
在 MySQL 中,幻读(Phantom Read)是指在一个事务中,两次相同的查询返回了不同的结果集,通常是由于其他事务插入或删除了符合查询条件的数据。为了保证没有幻读,MySQL 主要通过 事务隔离级别 和 锁机制 来实现…...

Golang实践录:go发布版本信息收集
go发布版本信息收集。 背景 本文从官方、网络资料收罗有关go的发布历史概况。主要目的是能快速了解golang不同版本的变更。鉴于官方资料为英文,为方便阅读,使用工具翻译成中文,重要特性参考其它资料补充/修改。由于发布版本内容较多…...

字节跳动AI原生编程工具Trae和百度“三大开发神器”AgentBuilder、AppBuilder、ModelBuilder的区别是?
字节跳动AI编程工具Trae与百度"三大开发神器"(AgentBuilder、AppBuilder、ModelBuilder)在定位、功能架构和技术路线上存在显著差异,具体区别如下: 一、核心定位差异 Trae:AI原生集成开发环境(AI…...

【UCB CS 61B SP24】Lecture 21: Data Structures 5: Priority Queues and Heaps 学习笔记
本文介绍了优先队列与堆,分析了最小堆的插入与删除过程,并用 Java 实现了一个通用类型的最小堆。 1. 优先队列 1.1 介绍 优先队列是一种抽象数据类型,其元素按照优先级顺序被处理。不同于普通队列的先进先出(FIFO)&…...

mapbox高阶,结合threejs(threebox)添加三维球体
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox Sphere静态对象二、🍀使用t…...

QEMU源码全解析 —— 块设备虚拟化(1)
本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 详解全虚拟半虚拟及硬件辅助虚拟化技术-百度开发者中心 特此致谢! 序言 本专栏之前的系列文章,讲了很多QEMU/KVM相关知识,其中一部分内容是设备的虚拟…...

IDEA中Git版本回退终极指南:Reset与Revert双方案详解
目录 前言一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提交历史1.2、选择目标版本1.3、选择回退模式1.3.1、Soft(推荐)1.3.2、Mixed1.3.3、Hard(慎用)1.3.…...

Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配
Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配 目录 Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配 一、简单介绍 二、简单介绍 flutter_screenutil 三、安装 carousel_slider 四、简单案例实现 五、关键代码 六、补…...

实验一:在Windows 10/11下配置和管理TCP/IP
目录 1.【实训目标】 2.【实训环境】 3.【实训内容】 4.【实训步骤】 1.【实训目标】 1.了解网络基本配置中包含的协议、服务、客户端。 2.了解Windows支持的网络协议及参数设置方法。 3.掌握TCP/IP协议的配置。 2.【实训环境】 硬件环境:每人一台计算机&a…...

基于hive的电信离线用户的行为分析系统
标题:基于hive的电信离线用户的行为分析系统 内容:1.摘要 随着电信行业的快速发展,用户行为数据呈现出海量、复杂的特点。为了深入了解用户行为模式,提升电信服务质量和精准营销能力,本研究旨在构建基于 Hive 的电信离线用户行为分析系统。通…...

Rust WebAssembly 入门教程
一、开发环境搭建 1. 基础工具安装 # 安装 Rust curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh# 安装 wasm-pack cargo install wasm-pack# 安装开发服务器 cargo install basic-http-server# 安装文件监听工具 cargo install cargo-watch2. VSCode 插件安装…...

部署RabbitMQ集群详细教程
部署RabbitMQ集群详细教程 下面是一份在 Ubuntu 环境下部署 RabbitMQ 集群的详细步骤说明,涉及主机名设置、Erlang & RabbitMQ 安装、管理插件启用、集群通信 Cookie 配置、节点加入集群、镜像队列策略设置以及集群验证等。为了演示方便,以下示例假…...

20250306JIRA添加企业微信邮箱通知
文章目录 一,参考链接如下二,补充内容1,登录企业邮箱2,设置密码3,设置收发信设置 一,参考链接如下 参考链接:https://blog.csdn.net/icett/article/details/142520823 二,补充内容…...

代码随想录算法训练营第五十七天 | 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题 104.建造最大岛屿
101. 孤岛的总面积 题目链接:KamaCoder 文档讲解:代码随想录 状态:AC Java代码: import java.util.*;class Main {static int count 0;static int res 0;static boolean island true;public static int[][] dir new int[][]{…...