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):模板匹配
原理及介绍 模板匹配是一种常用的图像处理技术,它用于在一幅图像中寻找与给定模板最匹配的区域(在一副大图中搜寻查找模版图像位置的方法)。模板匹配的基本思想是将模板图像在目标图像上滑动,并计算它们的相似度,找到相似度最高的位置即为匹配…...
机器学习--回归算法
🌳🌳🌳小谈:一直想整理机器学习的相关笔记,但是一直在推脱,今天发现知识快忘却了(虽然学的也不是那么深),但还是浅浅整理一下吧,便于以后重新学习。 …...
计算机网络——多址复用技术
1. 频分多址(FDMA) 1.1 基本原理 频率分配:在FDMA系统中,整个可用的频带被分割成多个较小的频带或通道。每个通道分配给一个用户。 时间利用:用户在分配给他们的频道上持续进行通信,不受时间限制。 1.2 优…...
stm32 HAL库 4096线ABZ编码器
[TOC]目录 ABZ编码器 4096线 买的是这个 AB相代表计数方向,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类似,可参照对比理解 Document :文档对象。每份HTML页面都是一个文档对象,Document 是 jsoup 体系中最顶层的结构。 Element:元素对象。一个 Document 中可以着包含着多个 Element 对象&#…...
如何在 C# 12 中使用主构造函数
C# 12 中最引人注目的新功能之一是对主构造函数的支持。主构造函数的概念并不新鲜。包括 Scala、Kotlin 和 OCaml 在内的多种编程语言都支持直接在声明类的位置集成构造函数参数。 在本文中,我们将仔细研究主构造函数以及如何在 C# 12 中使用它们。若要运行本文中提…...
Zookeeper之Java客户端实战
ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有: ZooKeeper官方的Java客户端API。第三方的Java客户端API,比如Curator。 接下来我们将逐一学习一下这两个java客户端是如何操作zookeeper的。 1. ZooKe…...
将文本文件导入Oracle数据库的简便方法:SQL Loader Express
需求 我有一个文本文件dbim.txt,是通过alert log生成的,内容如下: 2020-09-11 2020-09-11 ... 2023-12-03 2023-12-03 2023-12-26我已经在Oracle数据库中建立了目标表: 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都是远程过程调用(RPC)框架,用于实现分布式系统中不同节点之间的通信。它们之间的主要区别如下: 架构设计:Eureca是一个基于JavaScript的RPC框架,它使用了WebSockets作为传输层协议。Eureca C…...
python中parsel模块的css解析
一、爬虫页面分类 1.想要爬取的内容全部在标签中,可以使用xpath去进行解析如下图 2.想要爬取的内容呈现json的数据特征,用.json()转换为字典格式 3.页面不规则,标签中包含大括号,如下面想要获取键值内容怎么做,先用re正…...
Oracle OCP怎么样线上考试呢
大家好!今天咱们就来聊聊Oracle OCP这个让人又爱又恨的认证。为啥说又爱又恨呢?因为它既是IT界的“金字招牌”,又是一块硬骨头,不是那么容易啃下来的。好了,废话不多说,我们直奔主题,来看看关于…...
如何让自己的写的程序在阿里云一直运行
购买了阿里云服务器后,每次要用自己写在阿里云的服务器程序都要连接到云端 然后./运行该程序,而且每次一断开终端,该服务器就会自动停止,这样使用相当麻烦。那怎样才能让我们的服务器一直在云端后台运行,即便退出终端…...
【计算机图形学】NAP: Neural 3D Articulation Prior
文章目录 1. 这篇论文做了什么事,有什么贡献?2. Related Work铰接物体建模3D中的Diffusion model扩散模型 3. Pipeline铰接树参数化基于Diffusion的铰接树生成去噪网络 4. 实验评价铰接物体生成——以往做法与本文提出的新指标NAP捕捉到的铰接物体分布质…...
知识付费平台搭建?找明理信息科技,专业且高效
明理信息科技知识付费saas租户平台 在当今数字化时代,知识付费已经成为一种趋势,越来越多的人愿意为有价值的知识付费。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。同时,开发和…...
CentOS7部署Kafka
CentOS7部署Kafka 一、部署1、前置条件2、下载与解压3、修改配置4、启动kafka二、使用详解1、创建一个主题2、展示所有主题3、启动消费端接收消息4、生产端发送消息三、代码集成pom.xmlapplication.propertiesKafkaConfiguration.javaKafkaConsumer.javaKafkaProducer.javaVehi…...
JS的防抖和节流
目录 防抖 搜索框带来的问题 实现的思路 案例 封装防抖函数 节流 滚动条加载带来的问题 实现的思路 案例 封装节流函数 防抖 搜索框带来的问题 需求:根据输入框内容来请求数据 <!DOCTYPE html> <html lang"en"> <head><…...
互联网加竞赛 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类
文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径,图像尺寸,数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…...
pip安装报错SSL
confirming the ssl certificate: HTTPSConnectionPool(hostmirrors.cloud.tencent.com, port443) 错误代码如上 偶然搜索:ubuntu pip出错 confirming the ssl certificate: HTTPSConnectionPool(host‘mirrors.cloud.tencent.com’, port443) 看到这个回答 【日常踩…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
