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

OpenCV-Python(24):模板匹配

原理及介绍

        模板匹配是一种常用的图像处理技术,它用于在一幅图像中寻找与给定模板最匹配的区域(在一副大图中搜寻查找模版图像位置的方法)。模板匹配的基本思想是将模板图像在目标图像上滑动,并计算它们的相似度,找到相似度最高的位置即为匹配位置。

OpenCV中的模板匹配

cv2.matchTemplate()函数是OpenCV中用于模板匹配的函数。它的语法如下:

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

参数说明:

  • image:目标图像,即待搜索的图像。
  • template:模板图像,即待匹配的图像。
  • method:匹配方法,可以是以下几种方法之一:
    • cv2.TM_SQDIFF:平方差匹配法。
    • cv2.TM_SQDIFF_NORMED:归一化平方差匹配法。
    • cv2.TM_CCORR:相关匹配法。
    • cv2.TM_CCORR_NORMED:归一化相关匹配法。
    • cv2.TM_CCOEFF:相关系数匹配法。
    • cv2.TM_CCOEFF_NORMED:归一化相关系数匹配法。
  • result:可选参数,用于存储匹配结果的数组。
  • mask:可选参数,用于指定感兴趣区域的掩码。

算法步骤:
1.加载目标图像和模板图像。
2.将模板图像在目标图像上滑动,计算每个位置的相似度。
3.找到相似度最高的位置即为匹配位置。

具体实现方法如下(使用Python的OpenCV库):

import cv2
import numpy as np# 加载目标图像和模板图像
target_img = cv2.imread('target.jpg')
template_img = cv2.imread('template.jpg')# 获取目标图像和模板图像的宽高
target_h, target_w = target_img.shape[:2]
template_h, template_w = template_img.shape[:2]# 使用平方差匹配算法
result = cv2.matchTemplate(target_img, template_img, cv2.TM_SQDIFF)# 获取最匹配的位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
top_left = min_loc
bottom_right = (top_left[0] + template_w, top_left[1] + template_h)# 在目标图像上绘制矩形框
cv2.rectangle(target_img, top_left, bottom_right, (0, 255, 0), 2)# 显示结果图像
cv2.imshow('Result', target_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们首先加载了目标图像和模板图像,然后使用cv2.matchTemplate()函数进行模板匹配,得到匹配结果。最后,通过cv2.minMaxLoc()函数找到最匹配的位置,并在目标图像上绘制矩形框来表示匹配位置。

需要注意的是,模板匹配算法的结果可能受到光照、尺度、旋转等因素的影响。因此,在实际应用中,可能需要对图像进行预处理或使用其他更复杂的匹配算法来提高匹配的准确性。

cv2.matchTemplate()函数会在目标图像中搜索与模板图像相似的区域,并返回一个匹配结果矩阵。匹配结果矩阵的每个元素表示该位置与模板的匹配程度,值越小表示匹配程度越高。

在使用cv2.matchTemplate()函数时,需要根据具体的需求选择合适的匹配方法。常用的是平方差匹配法和相关系数匹配法。平方差匹配法适用于目标图像与模板图像具有明显的区别,相关系数匹配法适用于目标图像与模板图像具有相似的特征。

在使用匹配结果进行进一步处理时,可以通过设置匹配阈值来筛选出符合要求的匹配位置。只有匹配结果低于阈值的位置才会被认为是匹配的位置。

需要注意的是,cv2.matchTemplate()函数只能进行单对象模板匹配,如果需要进行多对象模板匹配,可以在匹配结果中进行进一步处理,例如使用非极大值抑制来消除重叠的匹配结果。

使用不同的匹配方法或得到不一样的匹配结果:

cv2.TM_CCOEFF:

cv2.TM_CCOEFF_NORMED: 

cv2.TM_CCORR: 

cv2.TM_CCORR_NORMED: 

cv2.TM_SQDIFF: 

cv2.TM_SQDIFF_NORMED: 

多对象模板匹配 

        多对象模板匹配是在一幅图像中寻找多个目标对象的位置。在前面的讲解中,我们在图片中搜素梅西的脸而且梅西只在图片中出现了一次,算法很好地完成了匹配。但是,假如你的目标对象在图像中出现了很多次要怎么办呢?函数cv2.imMaxLoc() 只会给出最大值和最小值。此时,我们就需要使用阈值了。在下面的例子中我们要在经典的游戏Mario 的一张截屏图片中找到其中的硬币。

import cv2
import numpy as np# 加载目标图像和模板图像
target_img = cv2.imread('target.jpg')
template_img = cv2.imread('template.jpg')# 获取目标图像和模板图像的宽高
target_h, target_w = target_img.shape[:2]
template_h, template_w = template_img.shape[:2]# 使用平方差匹配算法,也可以转成灰度图像进行比对
result = cv2.matchTemplate(target_img, template_img, cv2.TM_SQDIFF)# 设置匹配阈值
threshold = 0.9# 找到匹配结果中超过阈值的位置
locations = np.where(result <= threshold)
locations = list(zip(*locations[::-1]))# 在目标图像上绘制矩形框
for loc in locations:top_left = locbottom_right = (top_left[0] + template_w, top_left[1] + template_h)cv2.rectangle(target_img, top_left, bottom_right, (0, 255, 0), 2)# 显示结果图像
cv2.imshow('Result', target_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,我们首先加载了目标图像和模板图像,然后使用cv2.matchTemplate()函数进行模板匹配,得到匹配结果。然后,我们设置了一个匹配阈值,只有匹配结果低于该阈值的位置才会被认为是匹配的位置。最后,我们在目标图像上绘制矩形框来表示匹配位置。需要注意的是,多对象模板匹配可能存在重叠的情况,因此在实际应用中,可能需要进行进一步的处理来区分不同的目标对象。

效果如下:

相关文章:

OpenCV-Python(24):模板匹配

原理及介绍 模板匹配是一种常用的图像处理技术&#xff0c;它用于在一幅图像中寻找与给定模板最匹配的区域(在一副大图中搜寻查找模版图像位置的方法)。模板匹配的基本思想是将模板图像在目标图像上滑动&#xff0c;并计算它们的相似度&#xff0c;找到相似度最高的位置即为匹配…...

机器学习--回归算法

&#x1f333;&#x1f333;&#x1f333;小谈&#xff1a;一直想整理机器学习的相关笔记&#xff0c;但是一直在推脱&#xff0c;今天发现知识快忘却了&#xff08;虽然学的也不是那么深&#xff09;&#xff0c;但还是浅浅整理一下吧&#xff0c;便于以后重新学习。 &#x1…...

计算机网络——多址复用技术

1. 频分多址&#xff08;FDMA&#xff09; 1.1 基本原理 频率分配&#xff1a;在FDMA系统中&#xff0c;整个可用的频带被分割成多个较小的频带或通道。每个通道分配给一个用户。 时间利用&#xff1a;用户在分配给他们的频道上持续进行通信&#xff0c;不受时间限制。 1.2 优…...

stm32 HAL库 4096线ABZ编码器

[TOC]目录 ABZ编码器 4096线 买的是这个 AB相代表计数方向&#xff0c;Z代表过零点 cubemx配置 定时器Encoder 也可以选上DMA 中断 Z相GPIO中断 找一个空闲管脚 打开对应中断 代码 不用DMA int main(void) {short Enc_cnt 0;HAL_TIM_Encoder_Start_IT(&ht…...

Java爬虫之Jsoup

1.Jsoup相关概念 Jsoup很多概念和js类似&#xff0c;可参照对比理解 Document &#xff1a;文档对象。每份HTML页面都是一个文档对象&#xff0c;Document 是 jsoup 体系中最顶层的结构。 Element&#xff1a;元素对象。一个 Document 中可以着包含着多个 Element 对象&#…...

如何在 C# 12 中使用主构造函数

C# 12 中最引人注目的新功能之一是对主构造函数的支持。主构造函数的概念并不新鲜。包括 Scala、Kotlin 和 OCaml 在内的多种编程语言都支持直接在声明类的位置集成构造函数参数。 在本文中&#xff0c;我们将仔细研究主构造函数以及如何在 C# 12 中使用它们。若要运行本文中提…...

Zookeeper之Java客户端实战

ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有&#xff1a; ZooKeeper官方的Java客户端API。第三方的Java客户端API&#xff0c;比如Curator。 接下来我们将逐一学习一下这两个java客户端是如何操作zookeeper的。 1. ZooKe…...

将文本文件导入Oracle数据库的简便方法:SQL Loader Express

需求 我有一个文本文件dbim.txt&#xff0c;是通过alert log生成的&#xff0c;内容如下&#xff1a; 2020-09-11 2020-09-11 ... 2023-12-03 2023-12-03 2023-12-26我已经在Oracle数据库中建立了目标表&#xff1a; create table dbim(a varchar(16));我想把日志文件导入Or…...

element-ui table-自定义表格某列的表头样式或者功能

自带表格 自定义表格某列的表头样式或者功能 <el-table><el-table-column :prop"date">//自定义表身每行数据<template slot-scope"scope">{{scope.row[scope.column.label] - ? - : scope.row[scope.column.label]}}</template>…...

Android 13.0 SystemUI状态栏居中显示时间和修改时间显示样式

1.概述 在13.0的系统rom定制化开发中,在systemui状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局文件了 效果图如下: 2.SystemUI状态栏居中显…...

讲解eureca和nacus的区别

Eureca和Nacus都是远程过程调用&#xff08;RPC&#xff09;框架&#xff0c;用于实现分布式系统中不同节点之间的通信。它们之间的主要区别如下&#xff1a; 架构设计&#xff1a;Eureca是一个基于JavaScript的RPC框架&#xff0c;它使用了WebSockets作为传输层协议。Eureca C…...

python中parsel模块的css解析

一、爬虫页面分类 1.想要爬取的内容全部在标签中&#xff0c;可以使用xpath去进行解析如下图 2.想要爬取的内容呈现json的数据特征&#xff0c;用.json()转换为字典格式 3.页面不规则&#xff0c;标签中包含大括号&#xff0c;如下面想要获取键值内容怎么做&#xff0c;先用re正…...

Oracle OCP怎么样线上考试呢

大家好&#xff01;今天咱们就来聊聊Oracle OCP这个让人又爱又恨的认证。为啥说又爱又恨呢&#xff1f;因为它既是IT界的“金字招牌”&#xff0c;又是一块硬骨头&#xff0c;不是那么容易啃下来的。好了&#xff0c;废话不多说&#xff0c;我们直奔主题&#xff0c;来看看关于…...

如何让自己的写的程序在阿里云一直运行

购买了阿里云服务器后&#xff0c;每次要用自己写在阿里云的服务器程序都要连接到云端 然后./运行该程序&#xff0c;而且每次一断开终端&#xff0c;该服务器就会自动停止&#xff0c;这样使用相当麻烦。那怎样才能让我们的服务器一直在云端后台运行&#xff0c;即便退出终端…...

【计算机图形学】NAP: Neural 3D Articulation Prior

文章目录 1. 这篇论文做了什么事&#xff0c;有什么贡献&#xff1f;2. Related Work铰接物体建模3D中的Diffusion model扩散模型 3. Pipeline铰接树参数化基于Diffusion的铰接树生成去噪网络 4. 实验评价铰接物体生成——以往做法与本文提出的新指标NAP捕捉到的铰接物体分布质…...

知识付费平台搭建?找明理信息科技,专业且高效

明理信息科技知识付费saas租户平台 在当今数字化时代&#xff0c;知识付费已经成为一种趋势&#xff0c;越来越多的人愿意为有价值的知识付费。然而&#xff0c;公共知识付费平台虽然内容丰富&#xff0c;但难以满足个人或企业个性化的需求和品牌打造。同时&#xff0c;开发和…...

CentOS7部署Kafka

CentOS7部署Kafka 一、部署1、前置条件2、下载与解压3、修改配置4、启动kafka二、使用详解1、创建一个主题2、展示所有主题3、启动消费端接收消息4、生产端发送消息三、代码集成pom.xmlapplication.propertiesKafkaConfiguration.javaKafkaConsumer.javaKafkaProducer.javaVehi…...

JS的防抖和节流

目录 防抖 搜索框带来的问题 实现的思路 案例 封装防抖函数 节流 滚动条加载带来的问题 实现的思路 案例 封装节流函数 防抖 搜索框带来的问题 需求&#xff1a;根据输入框内容来请求数据 <!DOCTYPE html> <html lang"en"> <head><…...

互联网加竞赛 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…...

pip安装报错SSL

confirming the ssl certificate: HTTPSConnectionPool(hostmirrors.cloud.tencent.com, port443) 错误代码如上 偶然搜索&#xff1a;ubuntu pip出错 confirming the ssl certificate: HTTPSConnectionPool(host‘mirrors.cloud.tencent.com’, port443) 看到这个回答 【日常踩…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...