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

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. 模板匹配步骤
  1. 读取图像和模板:读取目标图像和模板图像。
  2. 转换为灰度图像:模板匹配通常在灰度图像上进行。
  3. 使用模板匹配:调用 cv2.matchTemplate() 执行匹配操作。
  4. 获取匹配结果:使用 cv2.minMaxLoc() 获取匹配结果的位置和相似度。
  5. 绘制矩形框:标记模板在目标图像中的匹配区域。

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. 多目标模板匹配

在实际应用中,常常需要在图像中寻找多个模板或多个目标。这时可以通过遍历匹配结果来定位多个匹配位置。

多目标匹配的实现步骤

  1. 使用 cv2.matchTemplate() 对目标图像和模板进行匹配。
  2. 使用 cv2.threshold() 设定一个阈值,从结果图像中筛选出匹配度较高的区域。
  3. 通过遍历匹配结果,提取出多个匹配区域的位置。
多目标模板匹配示例
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 让视图区域滑到指定位置、回到顶部

滑倒指定位置&#xff1a;获取指定的dom&#xff0c;然后用scrollIntoView使dom出现在视图区域 回到顶部&#xff1a;操作父级dom的scrollTop 0&#xff0c;让该父级下的列表回到顶部 代码如下 <template><div class"testDemo"><div><el-bu…...

EasyGBS点对点穿透P2P远程访问技术在安防视频监控中的应用

随着信息技术的快速发展&#xff0c;安防视频监控系统在公共安全领域的应用变得越来越广泛。传统的视频监控系统多依赖于中心服务器进行视频流的集中处理和分发&#xff0c;这不仅增加了网络带宽的负担&#xff0c;还可能成为系统性能瓶颈。为了解决这些问题&#xff0c;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——图片矫正

图像矫正 图像矫正的原理是透视变换&#xff0c;下面来介绍一下透视变换的概念。 听名字有点熟&#xff0c;我们在图像旋转里接触过仿射变换&#xff0c;知道仿射变换是把一个二维坐标系转换到另一个二维坐标系的过程&#xff0c;转换过程坐标点的相对位置和属性不发生变换&a…...

前端核心知识总结

‌前端架构知识总结‌主要包括以下几个方面&#xff1a; ‌HTML‌&#xff1a;HTML是构建网页的基础&#xff0c;使用各种标签定义网页的结构&#xff0c;如<html>、<head>、<body>等。HTML5引入了新的语义化标签&#xff0c;如<article>、<section…...

【C语言】五子棋(c语言实现)

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

【数据结构——查找】顺序查找(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;实现顺序查找的算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.根据输入数据建立顺序表&#xff0c;2.顺序表的输出&#xff0c;…...

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

【数模学习笔记】模糊综合评价

声明&#xff1a;以下笔记中的图片均来自“数学建模学习交流”清风老师的课程ppt&#xff0c;仅用作学习交流使用 模糊综合评价 文章目录 模糊综合评价模糊数学经典集合和模糊集合的基本概念经典集合和特征函数模糊集合和隶属函数模糊集合的分类 隶属函数的确定方法方法一 模糊…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...