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) 看到这个回答 【日常踩…...
手机视频监控客户端APP如何实现跨安卓、苹果和windows平台,并满足不同人的使用习惯
目 录 一、手机视频监控客户端的应用和发展 二、手机视频监控客户端存在的问题 三、HTML5视频监控客户端在手机上实现的方案 (一)HTML5及其优点 (二)HTML5在手机上实现视频应用功能的优势 四、手机HTML5…...
从写下第1个脚本到年薪40W,我的自动化测试心路历程
我希望我的故事能够激励现在的软件测试人,尤其是还坚持在做“点点点”的测试人。 你可能会有疑问:“我也能做到这一点的可能性有多大?”因此,我会尽量把自己做决定和思考的过程讲得更具体一些,并尽量体现更多细节。 …...
Vue CLI组件通信
目录 一、组件通信简介1.什么是组件通信?2.组件之间如何通信3.组件关系分类4.通信解决方案5.父子通信流程6.父向子通信代码示例7.子向父通信代码示例8.总结 二、props1.Props 定义2.Props 作用3.特点4.代码演示 三、props校验1.思考2.作用3.语法4.代码演示 四、prop…...
C语言编译器(C语言编程软件)完全攻略(第九部分:VS2019使用教程(使用VS2019编写C语言程序))
介绍常用C语言编译器的安装、配置和使用。 九、VS2019使用教程(使用VS2019编写C语言程序) 继《八、VS2019下载地址和安装教程(图解)》之后,本节给大家讲解如何用 VS2019 编写并运行 C 语言程序。 例如,在…...
走向云原生 破局数字化
近年来,随着云计算概念和技术的普及,云原生一词也越来越热门,云原生成为云计算领域的新变量。行业内,华为、阿里巴巴、字节跳动等各个大厂都在“抢滩”云原生市场。行业外,云原生也逐渐出圈,出现在大众视野…...
spring常用注解(三)springbean类
一、Service用于标注业务层组件、 二、Repository用于标注数据访问组件,即DAO组件。 三、Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。(pojo) 四、Scope用于指定scope作用域的ÿ…...
qiankun微服务
官网 📦 基于 single-spa 封装,提供了更加开箱即用的 API。 📱 技术栈无关,任意技术栈的应用均可 使用/接入,不论是 React/Vue/Angular/JQuery 还是其他等框架。 💪 HTML Entry 接入方式,让你接…...
文件夹重命名方法:提高效率减少错误,中英文批量翻译文件夹名称
在日常生活和工作中,经常要处理大量的文件夹,无论是整理电脑上的文件,还是为项目分类。如何快速、准确地重命名这些文件夹,对于提高工作效率和减少错误至关重要。现在来看下云炫文件管理器一些实用的文件夹重命名方法,…...
【PHP】where和whereOr一起复杂查询示例
在ThinkPHP 5 中,where 和 whereOr 方法可以一起使用以实现复杂的查询条件。以下是一个示例: // 接收的参数 $param $this->request->param();// 实例化 $query new UserModel();// 关联表 $query->with([collect > function($collect_qu…...
Mysql 动态链接库配置步骤+ 完成封装init和close接口
1、创建新项目 动态链接库dll 2、将附带的文件都删除,创建LXMysql.cpp 3、项目设置 3.1、预编译头,不使用预编译头 3.2、添加头文件 3.3、添加类 3.4、写初始化函数 4、项目配置 4.1、右键解决方案-属性-常规-输出目录 ..\..\bin 4.2、生成lib文件 右…...
用asp做网站流程/重庆森林台词
今年的面试主要是技术面试 1、项目是怎么做的 常规问题 --略 2、判断项目的可以上线的标准是什么? ①与需求一致,符合客户的要求 ②用例执行完成 ③bug和研发、产品这边确定必须改的改完 ④进行release版本回归无bug 3、给你一个登陆功能࿰…...
网站建设全包方案/软文营销文章范文
实现原理:客户端之间实现信息共享,需要中间服务器端进行信息转发。设置一个ArrayList,存储客户端列表,服务器每收到消息,就去遍历数组中的Socket并将消息转发。服务器端每连接一个客户端,就产生一个新的线程…...
如何做微网站平台/百度世界排名
ios操作系统的流畅度非常的高,因此人们都愿意购买 苹果 的手机。大家都知道苹果智能手机的售价是非常昂贵的,并不是社会上每一个人都可以负担得起的。有非常多的消费者为了可以达到非常好的操作体验,因此有非常多人们都会购买安卓智能手机&am…...
ui界面设计师/网站seo优化的目的
网络工程师成长日记371-卡夫食品中国有限公司项目回忆录 这是我的第371篇原创文章,记录网络工程师行业的点点滴滴,结交IT行业有缘之人 今天,我与老大一起去中大国际,为卡夫食品中国有限公司做项目尽管是项目不大,但第一…...
网站建设合作合同模板/百度服务平台
参考 《TCP/IP网络编程》 尹圣雨 多种I/O函数 send和recv函数 Linux中的send和recv (1)send #include <sys/socket.h>ssize_t send(int sockfd, const void* buf, size_t nbytes, int flags);成功时返回发送的字节数,失败时返回-…...
出入西安最新通知今天/快排seo排名软件
根据,我写的一篇文章《让程序产生bug,从而达到自我进化,是否能产生真正的智能生命,与人类沟通》的文章(点击打开链接)。我们在在超级计算机里,进化出智能程序,然后将智能程序转移到机…...