OpenCV--模板匹配
一、引言
在计算机视觉领域,模板匹配是一种用于在图像中查找特定目标的基本技术。OpenCV 作为广泛使用的计算机视觉库,提供了强大且易于使用的模板匹配功能。无论是在工业检测、图像识别还是机器人视觉等领域,模板匹配都发挥着重要作用。本文将深入探讨 OpenCV 中的模板匹配,包括其原理、使用方法、代码示例以及应用场景。
二、模板匹配原理
模板匹配是一种基于图像的模式识别方法,其核心思想是在一幅较大的图像中寻找与给定模板图像最相似的区域。OpenCV 中的模板匹配通过在输入图像上滑动模板图像,计算模板与每个位置的图像块之间的相似度得分。常用的相似度度量方法包括平方差匹配(TM_SQDIFF)、归一化平方差匹配(TM_SQDIFF_NORMED)、相关匹配(TM_CCORR)、归一化相关匹配(TM_CCORR_NORMED)以及系数匹配(TM_CCOEFF)和归一化系数匹配(TM_CCOEFF_NORMED)。
- 平方差匹配(TM_SQDIFF):计算模板与图像块之间对应像素值差的平方和。值越小,表示模板与图像块越相似。
- 归一化平方差匹配(TM_SQDIFF_NORMED):对平方差匹配结果进行归一化处理,使得结果在 0 到 1 之间,0 表示完全匹配。
- 相关匹配(TM_CCORR):计算模板与图像块之间对应像素值的乘积和,值越大表示越相似。
- 归一化相关匹配(TM_CCORR_NORMED):对相关匹配结果进行归一化,结果范围在 - 1 到 1 之间,1 表示完全匹配。
- 系数匹配(TM_CCOEFF):通过计算模板与图像块之间的协方差矩阵来衡量相似度,值越大越相似。
- 归一化系数匹配(TM_CCOEFF_NORMED):对系数匹配结果进行归一化,结果范围在 - 1 到 1 之间,1 表示完全匹配。
三、OpenCV 中的模板匹配函数
OpenCV 提供了cv2.matchTemplate()函数用于执行模板匹配操作。该函数的语法如下:
result = cv2.matchTemplate(image, template, method)
参数说明:
- image:输入的待搜索图像,通常是一幅较大的图像。
- template:用于匹配的模板图像,必须小于或等于输入图像的尺寸。
- method:指定使用的匹配方法,如上述提到的各种相似度度量方法。
函数返回一个二维数组result,其大小为(W - w + 1, H - h + 1),其中(W, H)是输入图像的尺寸,(w, h)是模板图像的尺寸。result数组中的每个元素表示对应位置的匹配得分。
四、代码示例
下面通过一个简单的 Python 代码示例来演示如何使用 OpenCV 进行模板匹配。
import cv2import numpy as npimport matplotlib.pyplot as plt# 读取输入图像和模板图像image = cv2.imread('input_image.jpg', cv2.IMREAD_COLOR)template = cv2.imread('template_image.jpg', cv2.IMREAD_COLOR)# 获取模板图像的高度和宽度h, w, _ = template.shape# 使用TM_CCOEFF_NORMED方法进行模板匹配result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)# 获取匹配结果中的最小值、最大值以及它们的位置min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)# 根据匹配方法确定匹配位置if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:top_left = min_locelse:top_left = max_loc# 计算矩形框的右下角位置bottom_right = (top_left[0] + w, top_left[1] + h)# 在输入图像上绘制矩形框标记匹配区域cv2.rectangle(image, top_left, bottom_right, (0, 255, 0), 2)# 显示结果图像plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))plt.title('Template Matching Result')plt.show()
在上述代码中:
- 首先读取输入图像和模板图像。
- 获取模板图像的尺寸,用于后续绘制矩形框。
- 使用cv2.matchTemplate()函数进行模板匹配,选择TM_CCOEFF_NORMED方法。
- 通过cv2.minMaxLoc()函数获取匹配结果中的最小值、最大值以及它们的位置。
- 根据选择的匹配方法确定匹配区域的左上角位置。
- 计算矩形框的右下角位置,并在输入图像上绘制矩形框标记匹配区域。
- 最后使用matplotlib显示结果图像。
五、应用场景
- 工业检测:在工业生产中,用于检测产品表面是否存在缺陷、零部件是否安装正确等。例如,在电路板生产中,通过模板匹配检测元件是否缺失或焊接不良。
- 目标识别:在图像或视频中识别特定的目标物体,如人脸识别、车牌识别等。例如,在监控视频中识别特定人员的面部。
- 图像拼接:通过模板匹配找到图像之间的重叠区域,实现图像的无缝拼接。例如,在全景图像生成中,将多张局部图像拼接成一张完整的全景图像。
- 游戏开发:在游戏中用于识别游戏元素,如角色、道具等。例如,在一款冒险游戏中,识别地图中的宝藏图标。
六、总结与注意事项
模板匹配是 OpenCV 中一项强大的图像处理技术,能够有效地在图像中查找特定目标。在使用过程中,需要注意以下几点:
- 模板选择:模板图像应具有代表性,能够准确描述要查找的目标特征。模板过大或过小都可能影响匹配效果。
- 匹配方法选择:不同的匹配方法适用于不同的场景,应根据实际需求选择合适的方法。例如,对于噪声较多的图像,归一化的方法可能更鲁棒。
- 多尺度匹配:如果目标物体在图像中的大小不确定,可以考虑进行多尺度匹配,即在不同缩放比例下进行模板匹配。
- 实时性:模板匹配的计算量较大,对于实时性要求较高的应用,可能需要进行优化,如使用 GPU 加速或采用更高效的算法。
相关文章:
OpenCV--模板匹配
一、引言 在计算机视觉领域,模板匹配是一种用于在图像中查找特定目标的基本技术。OpenCV 作为广泛使用的计算机视觉库,提供了强大且易于使用的模板匹配功能。无论是在工业检测、图像识别还是机器人视觉等领域,模板匹配都发挥着重要作用。本文…...
【Ragflow】14.MinerU解析脚本,接入ragflow知识库
概述 前文写了下 MinerU 的解析效果,收到不少读者催更,想利用 MinerU 替换 Deepdoc 的原始的解析器。 我认为,开发新功能基本可遵循能用-好用-用好这三个阶段: 能用:先通过脚本实现该功能,主打的是能用就行 好用&am…...
【SpringCloud】从入门到精通(上)
今天主播我把黑马新版微服务课程MQ高级之前的内容都看完了,虽然在看视频的时候也记了笔记,但是看完之后还是忘得差不多了,所以打算写一篇博客再温习一下内容。 课程坐标:黑马程序员SpringCloud微服务开发与实战 微服务 认识单体架构 单体架…...
第一章:SQL 基础语法与数据查询
1. 什么是 SQL? SQL(Structured Query Language) 是用于管理和操作关系型数据库的标准语言。核心功能: 数据查询(SELECT)数据定义(CREATE、ALTER、DROP࿰…...
Openlayers:海量图形渲染之WebGL渲染
最近由于在工作中涉及到了海量图形渲染的问题,因此我开始研究相关的解决方案。我在网络上寻找相关的解决方案时发现许多的文章都提到利用Openlayers中的WebGLPointsLayer类,可以实现渲染海量的点,之后我又了解到利用WebGLVectorLayer类可以渲…...
任务调度和安全如何结合
联邦学习与隐私保护 分布式模型训练:各边缘节点本地训练调度模型,仅共享模型参数而非原始数据,避免隐私泄露(参考[11]的联邦学习框架)。差分隐私:在奖励计算或状态反馈中加入噪声,防止通过调度…...
ARP攻击 DAI动态ARP检测学习笔记(超详细)
一、概述 ARP(Address Resolution Protocol,地址解析协议)是将IP地址解析为以太网MAC地址(或称为物理地址)的协议,指导三层报文的转发。ARP有简单、易用的优点,但是也因为其没有任何安全认证机制而容易被攻击者利用。属于是又爱又恨的一种协议了。目前ARP攻击和ARP病毒已经成为…...
Springboot--Kafka客户端参数关键参数的调整方法
调整 Kafka 客户端参数需结合生产者、消费者和 Broker 的配置,以实现性能优化、可靠性保障或资源限制。以下是关键参数的调整方法和注意事项: 一、生产者参数调整 max.request.size 作用:限制单个请求的最大字节数(包括消…...
NO.79十六届蓝桥杯备战|数据结构-扩展域并查集-带权并查集|团伙|食物链|银河英雄传说(C++)
扩展域并查集 普通的并查集只能解决各元素之间仅存在⼀种相互关系,⽐如《亲戚》题⽬中: a 和b 是亲戚关系,b 和c 是亲戚关系,这时就可以查找出a 和c 也存在亲戚关系。 但如果存在各元素之间存在多种相互关系,普通并查…...
蓝桥杯2022年第十三届省赛真题-统计子矩阵
题目链接: 代码思路: ①枚举上、下边界。 ②求每一列前缀和。 ②固定上下边界后,在通过双指针确定子矩阵的左右边界。双指针维护一个窗口 [l, r],确保窗口中所有列的和(下面前缀和-上面前缀和)不超过 K。通过滑动窗口方式&…...
openEuler24.03 LTS下安装Spark
目录 安装模式介绍 下载Spark 安装Local模式 前提条件 解压安装包 简单使用 安装Standalone模式 前提条件 集群规划 解压安装包 配置Spark 配置Spark-env.sh 配置workers 分发到其他机器 启动集群 简单使用 关闭集群 安装YARN模式 前提条件 解压安装包 配…...
openEuler24.03 LTS下安装Flink
目录 Flink的安装模式下载Flink安装Local模式前提条件解压安装包启动集群查看进程提交作业文件WordCount持续流WordCount 查看Web UI配置flink-conf.yaml简单使用 关闭集群 Standalone Session模式前提条件Flink集群规划解压安装包配置flink配置flink-conf.yaml配置workers配置…...
Redis 持久化
一、持久化 redis 虽然是个内存数据库,但是 redis 支持RDB 和 AOF 两种持久化机制, 将数据写往磁盘,可以有效的避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。 二、Redis 支持RDB 和 AOF …...
塔能科技:智能路灯物联运维产业发展现状与趋势分析
随着智慧城市建设的推进,智能路灯物联运维产业正经历快速发展,市场规模持续扩大。文章探讨了智能路灯物联运维的技术体系、市场机遇和挑战,并预测了未来发展趋势,为行业发展提供参考。 关键词 智能路灯;物联运维&#…...
前端知识点---闭包(javascript)
文章目录 1.怎么理解闭包?2.闭包的特点3.闭包的作用?4 闭包注意事项:5 形象理解 1.怎么理解闭包? 函数里面包着另一个函数,并且内部函数可以访问外部函数的变量。 <script>function outer(){let count 0return functioninner (){countconsole.l…...
单次 CMS Old GC 耗时长问题分析与优化
目录 一、现象说明 二、CMS GC 机制简述 三、可能导致长时间停顿的原因详细分析 (一)Full GC(完全垃圾回收) 1. 主要原因 2.参数调整 (二)Promotion Failure(晋升失败) 1. 主…...
Python星球日记 - 第16天:爬虫基础(仅学习使用)
🌟引言: 上一篇:Python星球日记 - 第15天:综合复习(回顾前14天所学知识) 名人说:不要人夸颜色好,只留清气满乾坤(王冕《墨梅》) 创作者:Code_流苏…...
【回眸】Linux 内核 (十四)进程间通讯 之 信号量
前言 信号量概念 信号量常用API 1.创建/获取一个信号量 2.改变信号量的值 3. 控制信号量 信号量函数调用 运行结果展示 前言 上一篇文章介绍的共享内存有局限性,如:同步与互斥问题、内存管理复杂性问题、数据结构限制问题、可移植性差问题、调试困难问题。本篇博文介…...
Python 字典和集合(字典的变种)
本章内容的大纲如下: 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的 顺序,等等) 字典的变种 这一节总结了…...
LeetCode】寻找重复子树:深度解析与高效解法
📖 问题描述 给定一棵二叉树的根节点 root ,返回所有重复的子树。若两棵树结构相同且节点值相同,则认为它们是重复的。对于同类重复子树,只需返回其中任意一棵的根节点。 🌰 示例解析 示例1 输入: 1/ …...
[蓝桥杯] 挖矿(CC++双语版)
题目链接 P10904 [蓝桥杯 2024 省 C] 挖矿 - 洛谷 题目理解 我们可以将这道题中矿洞的位置理解成为一个坐标轴,以题目样例绘出坐标轴: 样例: 输入的5为矿洞数量,4为可走的步数。第二行输入是5个矿洞的坐标。输出结果为在要求步数…...
Appium如何实现移动端UI自动化测试?
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门,那么我们就直奔主题。文章结构如下: 为什么要使用A…...
在集合中哪些可以为null,哪些不能为null;Java 集合中 null 值允许情况总结与记忆技巧
Java 集合中 null 值允许情况总结与记忆技巧 一、核心集合对 null 的支持情况 集合类型Key 是否可为 nullValue 是否可为 null原因/备注HashMap✅ 是✅ 是对 null key 有特殊处理(存放在数组第 0 个位置)LinkedHashMap✅ 是✅ 是继承自 HashMapTreeMap…...
Python 并发编程指南:协程 vs 多线程及其他模型比较
Python 并发编程指南:协程 vs 多线程及其他模型比较 并发编程是指在单个程序中同时处理多个任务的能力,这些任务可以交替进行(同一时刻并不一定真的同时运行),而并行则强调在同一时刻真正同时运行多个任务(…...
WPS JS宏编程教程(从基础到进阶)-- 第五部分:JS数组与WPS结合应用
目录 摘要第5章 JS数组与WPS结合应用5-1 JS数组的核心特性核心特性解析5-2 数组的两种创建方式(字面量与扩展操作符)1. 字面量创建2. 扩展操作符创建5-3 数组创建应用:提取字符串中的数字需求说明代码实现5-4 用函数创建数组(new Array、Array.of、Array.from)1. new Arra…...
STM32定时器完全指南:从基础原理到高级应用 | 零基础入门STM32第九十六步
主题内容教学目的/扩展视频TIM定时器重点课程定时器,捕获器,比较器,PWM,单脉冲。高级TIM。定时器中断。了解TIM使用 师从洋桃电子,杜洋老师 📑文章目录 一、定时器核心原理1.1 硬件架构解析1.2 核心参数公式…...
Kafka分区机制详解:原理、策略与应用
#作者:张桐瑞 文章目录 一、分区的作用二、分区策略(一)轮询策略(二)随机策略(三)按消息键保序策略 三、实际案例:消息顺序问题的解决四、其他分区策略:基于地理位置的分…...
最小K个数
文章目录 题意思路代码 题意 题目链接 思路 代码 class Solution { public:vector<int> smallestK(vector<int>& arr, int k) {priority_queue<int> Q;for (auto &index:arr){Q.push(index);if (Q.size() > k)Q.pop();}vector<int> ans…...
【STL】list介绍(附与vector的比较)
文章目录 1.关于list2.使用2.1 list的构造2.2 list 迭代器的使用2.3 list 容量操作2.3.1 size()2.3.2 empty()2.3.3 resize() 2.4 list 元素访问2.4.1 front()2.4.2 back() 2.5 list 修改操作2.5.1 push_front()2.5.2 pop_front()2.5.3 push_back()2.5.4 pop_back()2.5.5 inser…...
音视频生命探测仪,救援现场的“视听先锋”|鼎跃安全
地震等自然灾害的突发性和破坏性对人类生命构成严重威胁。据统计,地震后的“黄金72小时”内,被困者的存活率随时间的推移急剧下降,因此快速、精准的搜救技术至关重要。 传统搜救手段依赖人耳识别呼救声或手动挖掘,效率低且易造成二…...
Arch视频播放CPU占用高
Arch Linux配置视频硬件加速 - DDoSolitary’s Blog 开源神器:加速你的视频体验 —— libvdpau-va-gl-CSDN博客 VDPAU(Video Decode and Presentation API for Unix) VA-API(Video Acceleration API) OpenGL 我的电…...
Python技巧:二维列表 和 二维矩阵 的区别
np.vstack 是 NumPy 中的一个函数,用于将多个数组沿垂直方向(行方向)堆叠。它可以处理 二维列表 和 二维矩阵,但它们之间有一些关键区别。以下是详细说明: 1. 二维列表 定义: 二维列表是 Python 原生的数据结构&#x…...
Linux 命令清单(Linux Command List)
测试人员必备的 Linux 命令清单文件管理 ls —— 显示目录内容。 ls -l 使用 -l 选项查看详细信息。 cd —— 改变当前工作目录。 cd /path/to/directory mkdir —— 创建新目录。 mkdir new_directory rm —— 删除文件或目录。 rm filename rm -r directory 使用 …...
Wallaby‘s: Nightmare (v1.0.2)靶场渗透
Wallabys: Nightmare (v1.0.2) 来自 <Wallabys: Nightmare (v1.0.2) ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23…...
java基础 可拆分迭代器 Spliterator<T>
Spliterator Spliterator介绍核心方法tryAdvanceforEachRemainingtrySplitestimateSizetrySplit 结合并行流(Parallel Stream)关键注意事项总结 Spliterator介绍 Spliterator(Splittable Iterator)是 Java 8 引入的接口ÿ…...
【AI提示词】决策专家
提示说明 决策专家可以帮助你进行科学决策,尽可能避免错误,提升决策成功的概率。 提示词 # Role : 决策专家决策,是面对不容易判断优劣的几个选项,做出正确的选择。说白了,决策就是拿个主意。决策专家是基于科学决策…...
VectorBT量化入门系列:第二章 VectorBT核心功能与数据处理
VectorBT量化入门系列:第二章 VectorBT核心功能与数据处理 本教程专为中高级开发者设计,系统讲解VectorBT技术在量化交易中的应用。通过结合Tushare数据源和TA-Lib技术指标,深度探索策略开发、回测优化与风险评估的核心方法。从数据获取到策略…...
Spring Boot 配置文件加载优先级全解析
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 Spring Boot 配置文件加载优先级全解析 Spring Boot 的配置文件加载机制是开发者管理不同环境配置的核心功能之一。其通过外部化配置(Externaliz…...
System V 信号量:控制进程间共享资源的访问
System V 信号量:控制进程间共享资源的访问 在多进程操作系统中,当多个进程需要共享资源时,必须确保对资源的访问是有序的,以避免竞争条件(Race Condition)和数据不一致性问题。System V 信号量࿰…...
海运货代系统哪家好?能解决了哪些常见管理难题?
随着跨境电商的迅速发展,货代行业在全球供应链中扮演着越来越重要的角色。随着市场需求的多样化和国际运输环境的复杂化,货代企业面临的挑战也愈发复杂。为了应对这些挑战,数字化管理工具成为货代行业不可或缺的一部分。如今先进的海运货代系…...
预测性维护+智能优化:RK3568的储能双保险
在碳中和目标推动下,储能行业正经历前所未有的发展机遇。作为储能系统的核心组件,储能柜的智能化水平直接影响着整个系统的效率和安全性。RK3568智慧边缘控制器凭借其强大的计算能力、丰富的接口和高效的能源管理特性,正在成为工商储能柜的&q…...
蓝桥20257-元宵分配
#include <iostream> #include <bits/stdc.h> using namespace std; const int N1e910; typedef long long LL; int main() {// 请在此输入您的代码//将强其中的一碗全部倒进另一个中,将所有汤圆排序,最后选择前(N/2)…...
How to connect a mobile phone to your computer?
How to connect a mobile phone to your computer? 1. Background /ˈbkɡraʊnd/2. How to connect a mobile phone to your computer?References 1. Background /ˈbkɡraʊnd/ Let me introduce the background first. Today we will talk about this topic: How to conn…...
【力扣刷题实战】全排列II
大家好,我是小卡皮巴拉 文章目录 目录 力扣题目:全排列II 题目描述 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码(C) 兄弟们共勉 !!! 每篇前言 博客主页:小卡…...
题目练习之map的奇妙使用
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
Excel 日期值转换问题解析
目录 问题原因 解决方案 方法1:使用 DateTime.FromOADate 转换 方法2:处理可能为字符串的情况 方法3:使用 ExcelDataReader 时的处理 额外提示 当你在 Excel 单元格中看到 2024/12/1,但 C# 读取到 45627 时,这是…...
Linux--文件系统
ok,上次我们提到了硬件和inode,这次我们继续学习文件系统 ext2文件系统 所有的准备⼯作都已经做完,是时候认识下文件系统了。我们想要在硬盘上存储文件,必须先把硬盘格式化为某种格式的文件系统,才能存储文件。文件系…...
2025 年福建交安安全员考试:结合本省交通特点备考
福建地处东南沿海,交通建设具有独特特点,这对交安安全员考试备考意义重大。在桥梁建设方面,由于面临复杂的海洋环境,桥梁的防腐、防台风等安全措施成为重点。考生在学习桥梁施工安全知识时,要特别关注福建本地跨海大桥…...
【项目管理】第6章 信息管理概论 --知识点整理
项目管理 相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应&…...
python-leetcode 66.寻找旋转排序数组中的最小值
题目: 已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组,例如,原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到: 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若…...