Python+OpenCV系列:模版匹配
文章目录
- 1. 模板匹配基本原理
- 2. `cv2.matchTemplate()` 函数
- 函数原型:
- 3. 模板匹配步骤
- 4. 单目标模板匹配示例
- 5. 多目标模板匹配
- 多目标模板匹配示例
- 代码解析:
- 6. 多模板匹配
- 多模板匹配示例
- 代码解析
- 7. 总结
模板匹配是一种在图像中寻找模板的位置的方法。在计算机视觉中,模板匹配广泛应用于目标识别、物体跟踪、缺陷检测等领域。OpenCV 提供了强大的模板匹配功能,可以非常方便地在目标图像中找到与模板图像相似的区域。本文将详细讲解如何使用 Python 和 OpenCV 进行单目标和多目标模板匹配,包含多模板匹配的技巧。
1. 模板匹配基本原理
模板匹配的基本思想是将模板图像滑动到目标图像的不同位置,计算每个位置的匹配度,选择匹配度最高的位置。匹配度通常是通过计算模板图像与目标区域的相似度来评估的。常见的匹配方法包括:
- 平方差(SSD)
- 相关性(CCOEFF)
- 归一化互相关(CCOEFF_NORMED)
- 平方差归一化(SQDIFF_NORMED)
这些方法通过不同的计算方式,适应不同的图像匹配需求。
2. cv2.matchTemplate()
函数
OpenCV 提供的 cv2.matchTemplate()
函数用于执行模板匹配。它接收目标图像和模板图像作为输入,并返回一个结果图像,该图像的每个像素值表示模板在该位置的匹配度。
函数原型:
result = cv2.matchTemplate(image, template, method)
- image:目标图像(通常是灰度图像)。
- template:模板图像(通常是灰度图像)。
- method:匹配方法,常见方法有:
cv2.TM_CCOEFF
cv2.TM_CCOEFF_NORMED
cv2.TM_SQDIFF
cv2.TM_SQDIFF_NORMED
3. 模板匹配步骤
- 读取图像和模板:读取目标图像和模板图像。
- 转换为灰度图像:模板匹配通常在灰度图像上进行。
- 使用模板匹配:调用
cv2.matchTemplate()
执行匹配操作。 - 获取匹配结果:使用
cv2.minMaxLoc()
获取匹配结果的位置和相似度。 - 绘制矩形框:标记模板在目标图像中的匹配区域。
4. 单目标模板匹配示例
import cv2
import numpy as np# 读取图像和模板
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
template = cv2.imread('template.jpg', cv2.IMREAD_GRAYSCALE)# 执行模板匹配
result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)# 获取匹配结果的最小值、最大值和位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)# 绘制矩形框标记最佳匹配位置
top_left = max_loc
h, w = template.shape
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img, top_left, bottom_right, (0, 255, 0), 2)# 显示匹配结果
cv2.imshow('Matched Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 多目标模板匹配
在实际应用中,常常需要在图像中寻找多个模板或多个目标。这时可以通过遍历匹配结果来定位多个匹配位置。
多目标匹配的实现步骤:
- 使用
cv2.matchTemplate()
对目标图像和模板进行匹配。 - 使用
cv2.threshold()
设定一个阈值,从结果图像中筛选出匹配度较高的区域。 - 通过遍历匹配结果,提取出多个匹配区域的位置。
多目标模板匹配示例
import cv2
import numpy as np# 读取图像和模板
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
template = cv2.imread('template.jpg', cv2.IMREAD_GRAYSCALE)# 执行模板匹配
result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)# 设置匹配的阈值
threshold = 0.8
locations = np.where(result >= threshold)# 遍历所有匹配的位置,绘制矩形框
w, h = template.shape[::-1]
for pt in zip(*locations[::-1]):cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)# 显示匹配结果
cv2.imshow('Multiple Matched Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解析:
np.where(result >= threshold)
:找到所有匹配度大于等于设定阈值的匹配位置。zip(*locations[::-1])
:将结果数组的位置反转,以便于绘制矩形框。cv2.rectangle()
:在每个匹配位置绘制矩形框。
6. 多模板匹配
当我们有多个模板需要在图像中进行匹配时,可以通过循环处理每个模板进行匹配。每次循环都使用 cv2.matchTemplate()
对图像进行模板匹配,找出所有匹配的区域。
多模板匹配示例
import cv2
import numpy as np# 读取图像
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)# 模板列表
templates = ['template1.jpg', 'template2.jpg', 'template3.jpg']# 循环处理每个模板
for template_path in templates:# 读取当前模板template = cv2.imread(template_path, cv2.IMREAD_GRAYSCALE)# 执行模板匹配result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)# 设置匹配的阈值threshold = 0.8locations = np.where(result >= threshold)# 遍历所有匹配的位置,绘制矩形框w, h = template.shape[::-1]for pt in zip(*locations[::-1]):cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)# 显示匹配结果
cv2.imshow('Multiple Templates Matched', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解析
templates
:多个模板文件的路径列表。- 每次循环读取不同的模板并进行模板匹配。
- 对每个模板的匹配结果,使用
np.where()
提取所有匹配位置。
7. 总结
模板匹配是图像处理中非常基础且有效的技术,常用于目标检测、物体跟踪等任务。使用 OpenCV 中的 cv2.matchTemplate()
函数,我们能够在图像中找到与模板图像相似的区域。通过设置合适的匹配阈值和选择适当的匹配方法,我们可以实现多目标模板匹配和多模板匹配。在复杂场景中,模板匹配可能会受到图像旋转、尺度变化等因素的影响,因此在实际应用中,通常需要结合其他技术进行改进。
- 单目标模板匹配:寻找图像中最匹配的一个模板位置。
- 多目标模板匹配:在图像中找到多个匹配的区域。
- 多模板匹配:针对多个模板同时进行匹配。
模板匹配是图像处理中重要的一环,在一些简单、规则的场景下非常有效,但对于复杂背景和变化大的情况,可能需要结合其他计算机视觉技术来提高匹配精度。
相关文章:
Python+OpenCV系列:模版匹配
文章目录 1. 模板匹配基本原理2. cv2.matchTemplate() 函数函数原型: 3. 模板匹配步骤4. 单目标模板匹配示例5. 多目标模板匹配多目标模板匹配示例代码解析: 6. 多模板匹配多模板匹配示例代码解析 7. 总结 模板匹配是一种在图像中寻找模板的位置的方法。…...

【从零开始入门unity游戏开发之——C#篇10】循环结构——while、do-while、for、foreach的使用
文章目录 一、while 循环1、语法:2、示例: 二、 do-while 循环1、语法:2、示例: 三、for 循环1、语法:2、示例: 四、foreach 循环1、语法:2、示例: 五、总结对比六、注意事项七、使用…...
Spring Boot项目使用虚拟线程
Spring Boot项目启用虚拟线程 开始基本使用先写一个测试方法通过springboot配置项开启虚拟线程 目前存在的问题 开始 虚拟线程正式发布是在JDK21,对于Spring Boot版本选择3以上。 基本使用 关于虚拟线程本身的使用,之前已经介绍过。这里要说的是直接将…...

实现SpringBoot项目嵌入其他项目
很多时候我们需要在项目里面嵌入其他项目或者被其他项目嵌入,如我们开发一个开源项目b,用户需要在自己的项目a嵌入b项目,使用b项目的功能,而且要实现a项目工作最小化,最好实现引入即用。 1.定义b项目的自定义配置 …...

朗致面试---IOS/安卓/Java/架构师
朗致面试---IOS/安卓/Java/架构师 一、面试概况二、总结三、算法题目参考答案 一、面试概况 一共三轮面试: 第一轮是逻辑行测,25道题目,类似于公务员考试题目,要求90分钟内完成。第二轮是技术面试,主要是做一些数据结…...
数字信号处理:FIR滤波器
FIR(Finite Impulse Response,有限脉冲响应)滤波器是一种数字滤波器,其输出信号是输入信号的加权线性组合。FIR滤波器以其线性相位特性和易于设计的优势,广泛应用于信号处理、通信、音频处理等领域。 FIR滤波器的特点…...

鲲鹏麒麟安装Kafka-v1.1.1
因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1,因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…...

群控系统服务端开发模式-应用开发-操作记录功能开发
一、开放路由 在根目录下route文件夹下修改app.php文件,代码如下: // 操作日志Route::get(token/get_list,permission.Token/getList);// 获取操作日志列表Route::post(token/get_all,permission.Token/getAll);// 获取操作日志所有数据Route::post(toke…...

昇思25天学习打卡营第33天|共赴算力时代
文章目录 一、平台简介二、深度学习模型2.1 处理数据集2.2 模型训练2.3 加载模型 三、共赴算力时代 一、平台简介 昇思大模型平台,就像是AI学习者和开发者的超级基地,这里不仅提供丰富的项目、模型和大模型体验,还有一大堆经典数据集任你挑。…...
Vue 让视图区域滑到指定位置、回到顶部
滑倒指定位置:获取指定的dom,然后用scrollIntoView使dom出现在视图区域 回到顶部:操作父级dom的scrollTop 0,让该父级下的列表回到顶部 代码如下 <template><div class"testDemo"><div><el-bu…...

EasyGBS点对点穿透P2P远程访问技术在安防视频监控中的应用
随着信息技术的快速发展,安防视频监控系统在公共安全领域的应用变得越来越广泛。传统的视频监控系统多依赖于中心服务器进行视频流的集中处理和分发,这不仅增加了网络带宽的负担,还可能成为系统性能瓶颈。为了解决这些问题,P2P&am…...
Android 使用 Gson + OkHttp 实现 API 的常规使用(个人心得)
学习笔记 一、依赖和权限的添加 网络权限: 在 Android 中进行网络请求时,必须声明权限,确保应用具有访问互联网的能力。 <uses-permission android:name="android.permission.INTERNET"/> 依赖项: 确保在 build.gradle 中添加以下依赖: dependencies …...
WPF+MVVM案例实战与特效(三十九)- 深度剖析一个弧形进度条的实现
文章目录 1、使用 Path 结合 ArcSegment 绘制圆弧1、属性解读2、静态圆弧3、动态圆弧4、运行效果5、圆弧两端点的形状2、总结1、使用 Path 结合 ArcSegment 绘制圆弧 1、属性解读 Path 是 WPF 中的一个标记元素,用于绘制复杂的几何路径形状,而 ArcSegment 用于描述 Path 中…...

opencv——图片矫正
图像矫正 图像矫正的原理是透视变换,下面来介绍一下透视变换的概念。 听名字有点熟,我们在图像旋转里接触过仿射变换,知道仿射变换是把一个二维坐标系转换到另一个二维坐标系的过程,转换过程坐标点的相对位置和属性不发生变换&a…...
前端核心知识总结
前端架构知识总结主要包括以下几个方面: HTML:HTML是构建网页的基础,使用各种标签定义网页的结构,如<html>、<head>、<body>等。HTML5引入了新的语义化标签,如<article>、<section…...

【C语言】五子棋(c语言实现)
这里写目录标题 一、最终效果二、菜单打印函数三、棋盘的初始化和打印四、 人人对战4.1 落子判空函数4.2 悔棋函数4.3 判胜负函数4.4 人人对战 五、人机对战5.1 是将直接调用rand生成随机值,这就不可控5.2 是根据棋子赢面来判断哪里落子最好 六、如果选择退出程序直…...

【数据结构——查找】顺序查找(头歌实践教学平台习题)【合集】
目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现顺序查找的算法。 相关知识 为了完成本关任务,你需要掌握:1.根据输入数据建立顺序表,2.顺序表的输出,…...

Python的3D可视化库【vedo】2-1 (plotter模块) 绘制器的使用
文章目录 1 相关用语及其关系2 Plotter类的基本使用3 Plotter类具体的初始化设置3.1 全部初始化参数3.2 使用不同的axes vedo是Python实现的一个用于辅助科学研究的3D可视化库。 vedo的plotter模块封装了绘制器类Plotter。 Plotter实例可以用于显示3D图形对象、控制渲染器行为、…...

6.1 初探MapReduce
MapReduce是一种分布式计算框架,用于处理大规模数据集。其核心思想是“分而治之”,通过Map阶段将任务分解为多个简单任务并行处理,然后在Reduce阶段汇总结果。MapReduce编程模型包括Map和Reduce两个阶段,数据来源和结果存储通常在…...

【数模学习笔记】模糊综合评价
声明:以下笔记中的图片均来自“数学建模学习交流”清风老师的课程ppt,仅用作学习交流使用 模糊综合评价 文章目录 模糊综合评价模糊数学经典集合和模糊集合的基本概念经典集合和特征函数模糊集合和隶属函数模糊集合的分类 隶属函数的确定方法方法一 模糊…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...