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

OpenCV 模板匹配全解析:从单模板到多模板的实战指南

在这里插入图片描述

简介:本文深入探讨 OpenCV 中的模板匹配技术。详细介绍构建输入图像与模板图像的步骤,包括读取、截取、滤波与存储等操作。剖析 cv2.matchTemplate 语法及其参数含义,阐述不同匹配方法下结果值的意义。同时讲解 cv2.minMaxLoc 语法,并通过代码示例展示单模板匹配查找最小值与最大值的实现过程,以及多模板匹配的完整步骤,涵盖阈值设定、解的获取与标记绘制等,助您全面掌握 OpenCV 模板匹配要点,提升图像处理能力。
如果你觉得本文对你的OpenCV模板匹配学习有所帮助,请帮我点赞收藏 关注,我会持续创作更多的OpenCV相关的博文帮助你我共同进步。

OpenCV 模板匹配全解析:从单模板到多模板的实战指南

  • 模板匹配
    • 构建输入图像 与模板图像
  • cv2.matchTemplate语法
  • cv2.minMaxLoc语法
  • 单模板匹配查找最小值
  • 单模板匹配最大值
  • 多模版匹配
  • 致谢

模板匹配

是指把模板图像与输入进行比对滑动,遍历所有像素找到相似的。
在OpenCV中使用模板匹配分成两种,一种是单模版匹配,一种是多模板匹配。在本次的代码中使用了pig.JPG图像进行实验,大家可以复制图片然后跟自己的代码放在同一个文件夹下运行:
在这里插入图片描述

构建输入图像 与模板图像

模板图像构建的思路如下:
(第一步)把这个pig.JPG图像使用cv2.imread读取到项目文件中
(第二步)选择猪猪的眼睛对应的那部分np数组的索引
(第三步)使用高斯滤波对这部分进行平滑处理
(第四步)使用cv2.imwrite函数将做好的模板部分保存到pig_eye.JPG中
(这里使用高斯滤波的目的是为了不让截取的图片和原图一模一样)

import cv2
import numpy as np
img = cv2.imread("pig.JPG")
# print(img.shape)
img = img[300:400,220:370]
img = cv2.GaussianBlur(img,(5,5),0)
r = cv2.imwrite("eye.JPG",img)
cv2.imshow('eye',img)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
构建输入图像是为了可以实现验证多模板匹配的效果:
(第一步)读取pig.JPG图片的shape
(第二步)构建一个两倍宽度的全0数组
(第三步)将图片复制到数组中
(第四步)展示复制效果

import cv2
import numpy as np
img = cv2.imread("pig.JPG")
height,width,channels = img.shape
empty = np.zeros((height,2*width,channels),dtype = np.uint8)
empty[0:height,0:width] = img
empty[0:height,width:width*2] = img
r = cv2.imwrite("moudle.JPG",empty)
cv2.imshow('moudle',empty)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

cv2.matchTemplate语法

result 返回值是由每个位置比较结果构成的一个结果集 ,他的尺寸是 输入图像 - 模板图像+1 无论是宽还是高都一样 = cv2.matchTemplate(image输入图像,templ模板图像,method匹配方法,mask通常使用默认值 仅支持TM_SQDIFF 和 TM_CCORR_NORMED)

对于参数method而言,分两种情况:

  1. 若值为cv2.TM_SQDIFF和cv2.TM_SQDIFF_NORMED时,result值越低匹配效果越好
  2. 若值为cv2.TM_CCORR和cv2.TM_CCORR_NORMED和cv2.TM-CCOEFF和cv2.TM-CCOEFF_NORMED时,值越大匹配效果越好

cv2.minMaxLoc语法

minVal 返回的最小值,maxVal 返回的最大值,minLoc最小值的位置,maxLoc最大值的位置 = cv2.minMaxLoc( 数组)

单模板匹配查找最小值

(第一步)cv2.matchTemplate选择method
(第二步)把筛选结果放入cv2.minMaxLoc函数进行找最小值得位置
(第三步)这个位置是模板匹配的左上角,根据宽高还原
(第四步)使用cv2.rectangle画白色标记(没用过没关系,看代码一眼就明白了)

import cv2
import numpy as np
import matplotlib.pyplot as plt
img =cv2.imread('pig.JPG',0)
template = cv2.imread("eye.JPG",0)
# 获取模板图像的宽度和高度
th,tw = template.shape[::]
# 匹配获得结果
result = cv2.matchTemplate(img,template,cv2.TM_SQDIFF)
# 找到最小值就是结果最好的位置
minVal,_,minLoc,_ = cv2.minMaxLoc(result)
# 左上角坐标
topLeft = minLoc
# 右下角坐标
bottomRight = topLeft[0]+tw,topLeft[1]+th
# 画框 需要左上角右下角 灰度值范围 和框的宽度
cv2.rectangle(img,topLeft,bottomRight,255,2)plt.subplot(121)
plt.imshow(template,cmap = 'gray')
plt.title("template_image")
plt.axis("off")plt.subplot(122)
plt.imshow(img,cmap = 'gray')
plt.title("result")
plt.axis("off")

在这里插入图片描述

单模板匹配最大值

只要你读懂了上一个例子,这里只需要修改method参数和选最大值就解决了,直接上代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img =cv2.imread('pig.JPG',0)
template = cv2.imread("eye.JPG",0)
# 获取模板图像的宽度和高度
th,tw = template.shape[::]
# 匹配获得结果
result = cv2.matchTemplate(img,template,cv2.TM_CCOEFF)
# 找到最大值就是结果最好的位置
_,maxVal,_,maxLoc = cv2.minMaxLoc(result)
# 左上角坐标
topLeft = maxLoc
# 右下角坐标
bottomRight = topLeft[0]+tw,topLeft[1]+th
# 画框 需要左上角右下角 灰度值范围 和框的宽度
cv2.rectangle(img,topLeft,bottomRight,255,2)plt.subplot(121)
plt.imshow(template,cmap = 'gray')
plt.title("template_image")
plt.axis("off")plt.subplot(122)
plt.imshow(img,cmap = 'gray')
plt.title("result")
plt.axis("off")

在这里插入图片描述

多模版匹配

多模板匹配会有多个解,所以需要按照下面这个步骤去解决问题:
(第一步)cv2.matchTemplate选择method
(第二步)把筛选结果放入np.where(阈值)函数进行找所有满足阈值的解
(第三步)使用 for in zip的方式把解中的结果找出来
(第四步)找左上角坐标与 右下角坐标
(第五步)使用使用cv2.rectangle画白色标记

import cv2
import numpy as np
import matplotlib.pyplot as plt
img =cv2.imread('moudle.JPG',0)
template = cv2.imread("eye.JPG",0)
# 获取模板图像的宽度和高度
th,tw = template.shape[::]
# 匹配获得结果
result = cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)# 设置阈值
threshold = 0.9
# 把筛选结果放入np.where(阈值)函数进行找所有满足阈值的解
loc = np.where(result>=threshold)# 使用 for in zip的方式把解中的结果找出来
for pt in zip(*loc[::-1]):# 左上角坐标topLeft = pt# 右下角坐标bottomRight = topLeft[0]+tw,topLeft[1]+th# 画框 需要左上角右下角 灰度值范围 和框的宽度cv2.rectangle(img,topLeft,bottomRight,255,2)plt.subplot(121)
plt.imshow(template,cmap = 'gray')
plt.title("template_image")
plt.axis("off")plt.subplot(122)
plt.imshow(img,cmap = 'gray')
plt.title("result")
plt.axis("off")

在这里插入图片描述

致谢

本文参考了一些博主的文章,博取了他们的长处,也结合了我的一些经验,对他们表达诚挚的感谢,使我对 OpenCV模板匹配 有更深入的了解,也推荐大家去阅读一下他们的文章。纸上学来终觉浅,明知此事要躬行:
OpenCV第十章——模板匹配

相关文章:

OpenCV 模板匹配全解析:从单模板到多模板的实战指南

简介:本文深入探讨 OpenCV 中的模板匹配技术。详细介绍构建输入图像与模板图像的步骤,包括读取、截取、滤波与存储等操作。剖析 cv2.matchTemplate 语法及其参数含义,阐述不同匹配方法下结果值的意义。同时讲解 cv2.minMaxLoc 语法&#xff0…...

【JAVA] 杂谈: java中的拷贝(克隆方法)

这篇文章我们来介绍什么是拷贝,并且实现浅拷贝到深拷贝。 目录 一、浅拷贝 1.1 clone 方法 1.2 实现浅拷贝: 1.2.1 重写 clone方法 1.2.2 实现接口 Cloneable 1.2.3 调用克隆方法 1.2.4 原理图:​ 1.3 浅拷贝的不足 1.3.1 增加引用…...

使用 PDF API 合并 PDF 文件

内容来源: 如何在 Mac 上合并 PDF 文件 1. 注册与认证 您可以注册一个免费的 ComPDFKit API 帐户,该帐户允许您在 30 天内免费无限制地处理 1,000 多个文档。 ComPDFKit API 使用 JSON Web Tokens 方法进行安全身份验证。从控制面板获取您的公钥和密钥&…...

关于BeanUtils.copyProperties是否能正常复制字段【详细版】

话不多说!先总结: 1、字段相同,类型不同(不复制,也不报错) 2、子类父类 (1)子类传给父类(可以正常复制) (2)父类传给子类(可以正常复制) 3、子类父类&#x…...

爬虫框架快速入门——Scrapy

适用人群:零基础、对网络爬虫有兴趣但不知道从何开始的小白。 什么是 Scrapy? Scrapy 是一个基于 Python 的网络爬虫框架,它能帮助你快速爬取网站上的数据,并将数据保存到文件或数据库中。 特点: 高效:支…...

鸿蒙开发-HMS Kit能力集(应用内支付、推送服务)

1 应用内支付 开发步骤 步骤一:判断当前登录的华为账号所在服务地是否支持应用内支付 在使用应用内支付之前,您的应用需要向IAP Kit发送queryEnvironmentStatus请求,以此判断用户当前登录的华为帐号所在的服务地是否在IAP Kit支持结算的国…...

TYUT设计模式大题

对比简单工厂,工厂方法,抽象工厂模式 比较安全组合模式和透明组合模式 安全组合模式容器节点有管理子部件的方法,而叶子节点没有,防止在用户在叶子节点上调用不适当的方法,保证了的安全性,防止叶子节点暴露…...

Webman中实现定时任务

文章目录 Webman中实现定时任务一、引言二、安装与配置1、安装Crontab组件2、创建进程文件3、配置进程文件随Webman启动4、重启Webman5、Cron表达式(补充)例子 三、使用示例四、总结 Webman中实现定时任务 一、引言 在现代的后端开发中,定时…...

《以 C++破局:人工智能系统可解释性的探索与实现》

在当今科技飞速发展的时代,人工智能已深度融入我们的生活,从医疗诊断到金融决策,从交通管控到司法审判,其影响力无处不在。然而,在这些涉及重大利益和社会影响的关键领域,人工智能系统却面临着严峻的信任危…...

C++:QTableWidget删除选中行(单行,多行即可)

转自博客&#xff1a; Qt C -在QTableWidget中删除行 - 腾讯云开发者社区 - 腾讯云 我的界面&#xff1a; 采集机器人位置和姿态信息并写入QTableWidget控件中 删除代码&#xff1a; 1.获取要删除行的索引 2.删除行 QList<QTableWidgetItem*> items ui->tableW…...

C++类中多线程的编码方式

问题 在C++代码中,一般的代码是需要封装在类里面,比如对象,方法等。否则就不能很好的利用C++面向对象的能力了。 但是这个方式在处理线程时会碰到一个问题。 考虑下面一个简单的场景: class demoC { public:std::thread t;int x;void threadFunc(){std::cout<<x&…...

数据湖的概念(包含数据中台、数据湖、数据仓库、数据集市的区别)--了解数据湖,这一篇就够了

文章目录 一、数据湖概念1、企业对数据的困扰2、什么是数据湖3、数据中台、数据湖、数据仓库、数据集市的区别 网上看了好多有关数据湖的帖子&#xff0c;还有数据中台、数据湖、数据仓库、数据集市的区别的帖子&#xff0c;发现帖子写的都很多&#xff0c;而且专业名词很多&am…...

EDKII之安全启动详细介绍

文章目录 安全启动简介安全启动流程介绍签名过程BIOS实现小结 安全启动简介 安全启动&#xff08;Secure Boot&#xff09;是一种计算机系统的安全功能&#xff0c;旨在确保系统启动过程中只能加载经过数字签名的受信任的操作系统和启动加载程序。通过使用安全启动&#xff0c…...

原生js上传图片

无样式上传图片 创建一个 FormData 对象&#xff1a;这个对象可以用于存储数据。 将文件添加到 FormData 对象&#xff1a;通过 append() 方法&#xff0c;将用户选择的文件添加到 formData 对象中。 使用 fetch 发送请求&#xff1a;使用 fetch API 或者其他方法将 FormDat…...

使用torch==2.5.1版本用的清华源遇到的坑

解决安装torch后,torch.cuda.is_available()结果为false的问题 清华源下载到的torch2.5.1版本的Lib\site-packages\torch\version.py 其中&#xff0c;清华源指的是&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorchhttps://mirrors.tuna.tsinghua.…...

泷羽Sec-星河飞雪-BurpSuite之解码、日志、对比模块基础使用

免责声明 学习视频来自 B 站up主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 泷羽sec官网&#xff1a;http…...

对拍详细使用方法

对拍的作用 对于我们在学校OJ&#xff0c;cf&#xff0c;牛客…各种只提供少量测试数据的题目&#xff0c;常常交上代码常常超时&#xff0c;能写出正确的暴力代码而题目要求的时间复杂度更低。然而这时你写出了能通过样例且时间复杂度更低的代码&#xff0c;但交上去就是错误…...

Python面向对象编程与模块化设计练习

需求&#xff1a; 编写一个BankAccount类&#xff0c;模拟银行账户功能&#xff1a; 属性&#xff1a;账户名、余额 方法&#xff1a;存款、取款、查询余额 使用模块将类和测试代码分离。 模块文件&#xff1a;bank_account.py 该模块包含 BankAccount 类。 class BankAccoun…...

Linux系统硬件老化测试脚本:自动化负载与监控

简介&#xff1a; 这篇文章介绍了一款用于Linux系统的自动化硬件老化测试脚本。该脚本能够通过对CPU、内存、硬盘和GPU进行高强度负载测试&#xff0c;持续运行设定的时长&#xff08;如1小时&#xff09;&#xff0c;以模拟长时间高负荷运行的环境&#xff0c;从而验证硬件的稳…...

搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档

搭建一个基于Web的文档管理系统&#xff0c;用于存储、共享和协作编辑文档 本项目采用以下架构&#xff1a; NFS服务器: 负责存储文档资料。Web服务器: 负责提供文档访问和编辑功能。SELinux: 负责权限控制&#xff0c;确保文档安全。Git服务器: 负责存储文档版本历史&#x…...

VMware Unlocker:在非苹果硬件上运行macOS虚拟机的完整解决方案

VMware Unlocker&#xff1a;在非苹果硬件上运行macOS虚拟机的完整解决方案 【免费下载链接】unlocker 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker VMware Unlocker是一个开源工具&#xff0c;专门解决在非苹果硬件上使用VMware虚拟机运行macOS系统时的…...

AIVideo效果展示:输入主题输出专业视频,惊艳案例分享

AIVideo效果展示&#xff1a;输入主题输出专业视频&#xff0c;惊艳案例分享 1. 专业级视频生成效果概览 AIVideo一站式AI长视频工具能够将简单的文字主题转化为完整的专业视频作品。只需输入一个主题&#xff0c;系统就会自动完成从文案创作、分镜设计、画面生成到配音剪辑的…...

StructBERT中文Large模型技术白皮书精读:结构化预训练策略深度解读

StructBERT中文Large模型技术白皮书精读&#xff1a;结构化预训练策略深度解读 1. 项目概述与核心价值 StructBERT是由阿里达摩院开发的中文预训练语言模型&#xff0c;它在经典BERT架构基础上引入了结构化预训练策略&#xff0c;显著提升了中文语言理解能力。这个模型特别针…...

Xilinx Video IP实战:如何将HDMI输入转换为AXI4-Stream(附仿真+上板测试)

Xilinx Video IP实战&#xff1a;HDMI转AXI4-Stream全流程开发指南 在FPGA视频处理系统中&#xff0c;将HDMI等视频输入接口转换为标准化的AXI4-Stream协议是构建复杂视频处理流水线的关键第一步。不同于简单的接口转换&#xff0c;这一过程涉及视频时序解析、数据位宽适配、时…...

MultiHighlight插件完全指南:5步提升代码阅读效率300%

MultiHighlight插件完全指南&#xff1a;5步提升代码阅读效率300% 【免费下载链接】MultiHighlight Jetbrains IDE plugin: highlight identifiers with custom colors &#x1f3a8;&#x1f4a1; 项目地址: https://gitcode.com/gh_mirrors/mu/MultiHighlight 在当今快…...

量子行走:从理论到Python实现——3. 量子门、电路与编程基础

目录 3. 量子门、电路与编程基础 3.1 单量子比特门 3.1.1 泡利门与旋转门 3.1.2 哈达玛门与相位门 3.2 多量子比特门 3.2.1 受控门 3.2.2 纠缠门与SWAP操作 3.3 量子电路构建与优化 3.3.1 电路表示与DAG结构 3.3.2 变分电路 3. 量子门、电路与编程基础 量子计算体系的…...

RK3588开发板跑YOLOv5视频流demo,遇到Segmentation fault别慌!保姆级core文件生成与调试指南

RK3588开发板YOLOv5视频流推理崩溃排查&#xff1a;从Segmentation fault到精准调试全攻略 当你在RK3588开发板上满心期待地运行YOLOv5视频流推理demo时&#xff0c;屏幕上突然闪现的"Segmentation fault (core dumped)"就像一盆冷水浇灭了热情。这种崩溃提示信息量极…...

本地图片检索新方案:ImageSearch完全使用指南

本地图片检索新方案&#xff1a;ImageSearch完全使用指南 【免费下载链接】ImageSearch 基于.NET8的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 当你的电脑中存储了成千上万张图片&…...

2026年必看:专业婚恋软件推荐,找到真爱不迷路

在当今快节奏的社会中&#xff0c;越来越多的高知青年面临着交友难、脱单难的问题。传统的社交方式往往难以满足他们对高质量伴侣的需求&#xff0c;而专业的婚恋软件则成为他们寻找真爱的重要途径。本文将重点推荐一款备受好评的婚恋软件——即恋App&#xff0c;并结合具体数据…...

python-flask-djangol框架的青少年编程学习平台

目录技术选型与架构设计功能模块划分开发阶段规划安全与扩展性示例代码片段&#xff08;Flask路由&#xff09;部署与运维教育适配项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作技术选型与架构设计 采用Python生态的Flask或D…...