Python----计算机视觉处理(Opencv:模板匹配)

一、 概念

        模板匹配就是用模板图(通常是一个小图)在目标图像(通常是一个比模板图大的图片)中不断的滑动 比较,通过某种比较方法来判断是否匹配成功。

 二、应用场景

1. 目标检测与识别:在计算机视觉领域,模板匹配常用于目标检测与识别。 通过提前准备好的模板图像,可以在输入图像或视频流中识别出具有相似 特征的目标物体,从而实现目标检测与识别。

2. 视频分析与目标跟踪:在视频分析中,模板匹配可用于实现目标物体的跟 踪与追踪。借助模板匹配算法,可以在视频序列中追踪目标物体的运动轨 迹,实现目标跟踪功能。

 三、匹配方法

3.1、平方差匹配TM_SQDIFF

        以模板图与目标图所对应的像素值使用平方差公式来计算,其结果越小,代表匹配程度越高。

3.2、归一化平方差匹配TM_SQDIFF_NORMED

        与平方差匹配类似,只不过需要将值统一到0到1,计算结果越小,代表匹配程度越高

3.3、相关匹配TM_CCORR

        使用对应像素的乘积进行匹配,乘积的结果越大其匹配程度越高

3.4、归一化相关匹配TM_CCORR_NORMED

        与相关匹配类似,只不过是将其值统一到0到1之间,值越大,代表匹配程度越高

3.5、相关系数匹配TM_CCOEFF

        需要先计算模板与目标图像的均值,然后通过每个像素与均值之间的差的乘积再求和来表示其匹配程 度,1表示完美的匹配,-1表示最差的匹配

3.6、归一化相关系数匹配TM_CCOEFF_NORMED

        也是将相关系数匹配的结果统一到0到1之间,值越接近1代表匹配程度越高

四、绘制轮廓 

 导入模块

import cv2
import numpy as np

输入图像

img = cv2.imread('mali.png')
img_template = cv2.imread('jinbi.png')

灰度化

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_template_gray = cv2.cvtColor(img_template, cv2.COLOR_BGR2GRAY)

模板匹配

res = cv2.matchTemplate(img_gray, img_template_gray, cv2.TM_CCOEFF_NORMED)

 筛选数据

threshold = 0.73
location = np.where(res > threshold)

绘制轮廓

for i in zip(*location[::-1]):right_bottom = (i[0] + w, i[1] + h)cv2.rectangle(img, i, right_bottom, (0, 0, 255))

 输出图像

cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

完整代码

import cv2  
import numpy as np  # 读取原始图像  
img = cv2.imread('mali.png')  # 读取模板图像  
img_template = cv2.imread('jinbi.png')  # 将原始图像转换为灰度图像  
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 将模板图像转换为灰度图像  
img_template_gray = cv2.cvtColor(img_template, cv2.COLOR_BGR2GRAY)  # 获取模板灰度图像的高度(h)和宽度(w)  
h, w = img_template_gray.shape  # 在原始灰度图像中执行模板匹配  
res = cv2.matchTemplate(img_gray, img_template_gray, cv2.TM_CCOEFF_NORMED)  # 设置匹配的阈值,只有大于该值的匹配才会被考虑  
threshold = 0.73  # 找到所有匹配结果的位置  
location = np.where(res > threshold)  # 在每个匹配位置绘制矩形框  
for i in zip(*location[::-1]):  # 反转位置元组(从列开始)  right_bottom = (i[0] + w, i[1] + h)  # 计算矩形的右下角坐标  cv2.rectangle(img, i, right_bottom, (0, 0, 255), thickness=2)  # 绘制红色矩形框  # 显示带有矩形框的图像  
cv2.imshow('img', img)  # 等待用户按键  
cv2.waitKey(0)  # 关闭所有OpenCV窗口  
cv2.destroyAllWindows()  

疑难解读

np.where(res > threshold)

        np.where 返回的是一个包含多维数组索引的元组。对于二维图像(如模板匹配的结果),返回的 location 是一个元组,包含两个数组:一个是所有行坐标,一个是所有列坐标。

zip(*location[::-1])

        location[::-1]:
        这个操作是用来反转元组的顺序。元组的格式是 (行数组, 列数组),反转之后会成为 (列数组, 行数组),这样做是为了确保接下来的 zip 操作可以正确地将坐标组合成元组。

        zip(*location[::-1]):
        zip 函数用于将多个可迭代对象的元素组合成元组。在这里,* 运算符用于解包 location[::-1],把反转后的元组传入到 zip 函数中。

五、库函数

5.1、matchTemplate()

cv.matchTemplate(	image, templ, method[, result[, mask]]	) ->	result
方法描述
image运行搜索的图像。它必须是 8 位或 32 位浮点。
templ搜索到的模板。它必须不大于源图像,并且具有相同的数据类型。
result比较结果的映射。它必须是单通道 32 位浮点
method指定比较方法的参数,请参阅 TemplateMatchModes
mask可选掩码。它的大小必须与 templ 相同。它必须具有与模板相同的通道数,或者只有一个通道,然后用于所有模板和图像通道。如果数据类型为 CV_8U,则掩码将被解释为二进制掩码,这意味着仅使用 mask 为非零的元素,并且这些元素保持不变,与实际掩码值无关(权重等于 1)。对于数据 tpye CV_32F,掩码值用作权重。确切的公式记录在 TemplateMatchModes 中。
Enumerator
TM_SQDIFF 
Python: cv.TM_SQDIFF
TM_SQDIFF_NORMED 
Python: cv.TM_SQDIFF_NORMED
TM_CCORR 
Python: cv.TM_CCORR
TM_CCORR_NORMED 
Python: cv.TM_CCORR_NORMED
TM_CCOEFF 
Python: cv.TM_CCOEFF
TM_CCOEFF_NORMED 
Python: cv.TM_CCOEFF_NORMED

5.2、np.where() 

        numpy.where 是 NumPy 库中的一个非常有用的函数,它可以根据指定的条件返回 满足该条件的元素的索引。

        当 numpy.where 接受一个条件作为参数时,它会返回一个元组,其中包含满足该条 件的元素的索引。

numpy.where(condition)
函数说明
condition一个布尔数组或条件表达式。
返回值
一个元组,其中包含满足条件的元素的索引。

详情查看 

Python----数据分析(Numpy四:广播机制,数组的运算,统计计算,where函数)_数组广播-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39661.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【stm32】用从模式控制器 完成PWM的测量

🌞学习视频还是来自于 铁头山羊 🌿主要是回顾一下他讲的这一章的定时器的部分,具体的话 还是看一下具体铁头山羊的视频,讲的很清楚~~ 整体流程是这样的,首先通过定时器的输出比较功能,配置好PA6产生一个特定…

【C#】CS学习之Modbus通讯

摘要 本文详细描述了如何在在C#的Winform应用程序中使用NModbus库实现Modbus通讯,包括读取保持寄存器、以及相应的UI界面设计和事件处理。 前言 ​应用场景 Modbus 从站广泛应用于工业自动化领域: 1、传感器数据采集(如温度、压力等&#xf…

Pycharm社区版创建Flask项目详解

一、创建工程项目 二、配置工程目录 新建的空项目下创建目录。 1、新建app.py文件 2、app.py代码如下: from flask import Flask, render_templateapp Flask(__name__)app.route("/") def root():"""主页:return: Index.html"&qu…

Linux 基础入门操作 第十二章 TINY Web 服务器

1 服务器基础架构 1.1 背景知识 Web 服务器使用 HTTP 协议与客户端(即浏览器)通信,而 HTTP 协议又基于 TCP/IP 协议。因此我们要做的工作就是利用 Linux 系统提供的 TCP 通信接口来实现 HTTP 协议。 而 Linux 为我们提供了哪些网络编程接口…

RAG优化:python从零实现[吃一堑长一智]循环反馈Feedback

本文将介绍一种有反馈循环机制的RAG系统,让当AI学会"吃一堑长一智",给传统RAG装了个"后悔"系统,让AI能记住哪些回答被用户点赞/拍砖,从此告别金鱼记忆: 每次回答都像在玩roguelike:失败结局会强化下次冒险悄悄把优质问答变成新知识卡牌,实现"以…

基于SpringBoot的名著阅读网站

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

[AI建模] 使用Pinokio本地化部署混元2D到3D AI建模服务

近年来,AI驱动的2D转3D建模技术发展迅猛,而Pinokio作为一个强大的AI模型管理与部署平台,使得在本地部署这些复杂的AI模型变得更加简单高效。本文将介绍如何使用Pinokio在本地部署混元2D到3D AI建模服务,并快速生成带或不带Texture的3D模型。 1. 在Pinokio Discover页面找到…

Qt 导入TagLib库

文章目录 0. 前言和环境介绍1. 下载TagLib2. 下载zlib3. 修改.pro文件4. 测试代码 0. 前言和环境介绍 最近在使用Qt写一个播放器,需要解析mp3文件,于是研究了一下如何导入TagLib库 Qt构建套件:Desktop Qt6.8.2 MinGW64-bit Qt Creator安装目录: D:\bit…

【前端面试题】计算机网络相关

总结面试前端过程可能会问到的计算机网络相关知识点 1.HTTP和HTTPS的区别 (1)HTTPS HTTP 安全加密 HTTPS 是 HTTP 的 加密版,通过 SSL/TLS 保障数据安全,防止窃听和篡改。 (2)HTTPS 如何保护数据&…

【RabbitMQ高级特性】消息确认机制、持久化、发送方确认、TTL和死信队列

🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、消息确认机制 消费者确认机制确保消息被正确处理后才从队列中删除。如果消费者处理失败(如业务异常或宕机),Broker 会重新投递消息…

调用百度api实现语音识别(python)

该代码实现了一个企业级的语音识别解决方案,通过调用百度语音识别API,实现实时录音识别和对已有音频语音识别功能。 百度智能云:请自行访问百度智能云,开通免费的语音识别功能,获取API_KEY和SECRET_KEY。操作按照百度流程即可,可免费申请。 首先,配置下百度API和描述下错…

Python实现小红书app版爬虫

简介:由于数据需求的日益增大,小红书网页版已经不能满足我们日常工作的需求,为此,小编特地开发了小红书手机版算法,方便大家获取更多的数据,提升工作效率。 手机版接口主要包括:搜素&#xff0…

【AndroidRTC-11】如何理解webrtc的Source、TrackSink

Android-RTC系列软重启,改变以往细读源代码的方式 改为 带上实际问题分析代码。增加实用性,方便形成肌肉记忆。同时不分种类、不分难易程度,在线征集问题切入点。 问题1:如何理解VideoSource、VideoTrack&VideoSink三者的关系…

Windows安装Rust环境(详细教程)

一、 安装mingw64(C语言环境) Rust默认使用的C语言依赖Visual Studio,但该工具占用空间大安装也较为麻烦,可以选用轻便的mingw64包。 1.1 安装地址 (1) 下载地址1-GitHub:Releases niXman/mingw-builds-binaries GitHub (2) 下载地址2-W…

英伟达黄仁勋谈人工智能趋势,首提代理式AI,后续机器人将登场

近日,英伟达 GTC 2025 大会主题演讲中,英伟达 CEO 黄仁勋再次身穿皮衣登场。黄仁勋一上来就提到了 AI 发展的未来,现在我们处于生成式 AI(Generative AI)阶段,但根据黄仁勋的路线图,我们将迈向一…

LCR 187. 破冰游戏(python3解法)

难度:简单 社团共有 num 位成员参与破冰游戏,编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target,从 0 号成员起开始计数,排在第 target 位的成员离开圆桌,且成员离开后从下一个成员开始计数…

水星(MERCURY)监控初始化的恢复和转码方法

水星(MERCURY)的安防监控恢复了很多,其嵌入式文件系统也一直迭代更新。做为数据恢复从业者每天处理最多的就是恢复数据,但是有的时候业务的需要我们不仅仅恢复出数据,还需要能够转码成通用的MP4类文件并要求画面和声音实现“同步”。 故障存…

基于SpringBoot的实现的客户关系管理系统(CRM)(源码+数据库)

464客户关系管理系统(CRM),主要功能如下 【后台功能】 权限管理模块: 包括系统的登录与注册功能 用户管理模块: 基于RBAC的权限模型设计, 实现分配角色的功能功能 客户管理模块: 对客户信息进行新增 修改 删除 查看 联络信息管理模块: 对联络…

关于网络的一点知识(持续更新)

1、IP地址和子网掩码、端口号: IP地址是设备在网络上的地址,相当于一栋房子的门牌号。子网掩码相当于房子所在的街道。同一条街道的房子间是通过街道直通的,主人可以互相拜访。 举个例子,如下图所示。 说明:将两台设备的IP和子网掩码转化为二进制,然后将各自的IP地址和…

Python---数据分析(Pandas八:二维数组DataFrame数据操作一: 数据清洗,数据转换)

一、 数据清洗 1.1、 isnull() 用于检测 DataFrame 中的缺失值,它会返回一个相同形状的布尔型 DataFrame,其中每个元素表示原始 DataFrame 中相应位置的元素是否是缺失 值。 import pandas as pd import numpy as np# 创建一个包含缺失值的 DataFrame …