《OpenCV》——模版匹配

文章目录

  • OpenCV——模版匹配简介
  • 模版匹配使用场景
  • OpenCV 中模板匹配的函数
    • 参数
  • OpenCV——模版匹配实例
    • 导入所需库
    • 读取图片并处理图片
    • 对模版图片进行处理
    • 进行模版匹配
    • 显示模版匹配的结果
    • 注意事项

OpenCV——模版匹配简介

  • OpenCV 是一个非常强大的计算机视觉库,其中的模板匹配功能提供了高效的工具来实现图像中的目标定位。
  • 从本质上来说,模板匹配是一种用于在给定的图像(或其他类型的数据,如文本序列等,但主要以图像为例)中寻找与已知模板最相似部分的方法。这个模板可以是一个小的图像区域,例如,你想在一张风景照片中找到某个特定的标志,这个标志的图像就是模板。
  • 它的基本原理是通过在目标图像的各个位置滑动模板,并计算模板与图像在每个位置的相似度度量。这个相似度度量可以通过多种方式计算,例如计算像素值的差异等。

模版匹配使用场景

  • 目标检测:假设在一个监控视频中,需要检测是否出现了特定的物体,如汽车的车牌。可以将车牌的标准图像作为模板,在视频的每一帧图像中进行模板匹配,找到与车牌模板最相似的区域,从而实现车牌的定位检测。
  • 物体识别:如果要识别图像中的某个产品品牌标志,把不同品牌标志的图像做成模板,在目标图像中进行匹配,通过比较匹配程度来判断物体属于哪个品牌。

OpenCV 中模板匹配的函数

在 OpenCV 中,主要使用matchTemplate函数来进行模板匹配。这个函数的基本语法如下:

result = cv2.matchTemplate(image, templ, method)

参数

  • image:这是目标图像,也就是要在其中寻找模板的图像。它应该是一个 8 位或 32 位的单通道或彩色图像。
  • templ:这是模板图像,是要在目标图像中找到的小图像区域。同样可以是单通道或彩色图像,但要注意其尺寸通常比目标图像小。
  • method:这是匹配方法,OpenCV 提供了多种匹配方法,如cv.TM_SQDIFF(平方差匹配法)、cv.TM_CCORR(相关性匹配法)、cv.TM_CCOEFF(相关系数匹配法)等。不同的方法在计算模板和目标图像之间的相似度时有不同的侧重点。
  • 例如,cv.TM_SQDIFF方法计算模板与目标图像每个位置的平方差,得到的结果矩阵中,值越小表示匹配程度越高;而cv.TM_CCORR方法计算相关性,值越大表示匹配程度越高。

OpenCV——模版匹配实例

对下方图片进行模版匹配:
在这里插入图片描述
模版:
在这里插入图片描述
目标:找到图中所有的箭头

导入所需库

  • 首先需要导入 OpenCV 库和 NumPy 库。
import cv2
import numpy as np

读取图片并处理图片

img_rgb = cv2.imread('yuan_tu.jpg')
# 对图片进行灰度图处理
img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)
template = cv2.imread('jian_tou.jpg', 0)
# 读取模版图片的高和宽
h,w = template.shape[:2]

对模版图片进行处理

通过对模版图片的顺时针和逆时针处理,后面能将所有箭头都找出。

# 分别顺时针逆时针旋转
xuan_zhuan1 =cv2.rotate(template,cv2.ROTATE_90_CLOCKWISE)xuan_zhuan2 =cv2.rotate(template,cv2.ROTATE_90_COUNTERCLOCKWISE)

进行模版匹配

通过遍历箭头图片和处理后的两张箭头图片,将得到的结果绘制到原图上。

# 进行模版匹配
for i in [template,xuan_zhuan1,xuan_zhuan2]:res = cv2.matchTemplate(img_gray,i,cv2.TM_CCOEFF_NORMED)# 设定匹配阈值threshold = 0.9# 获取匹配结果中所有符合阈值的坐标loc = np.where(res>=threshold)# 遍历所有匹配点for pt in zip(*loc[::-1]):# 在原图上绘制匹配区域的矩形框cv2.rectangle(img_rgb,pt,(pt[0]+w,pt[1]+h),(0,0,255),1)

显示模版匹配的结果

显示图片结果,结束后释放内存。

cv2.imshow('res.png',img_rgb)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

注意事项

  • 图像预处理:在进行模板匹配之前,可能需要对目标图像和模板图像进行预处理。例如,将图像转换为灰度图(如果使用基于灰度的匹配方法),或者进行归一化操作以减少光照等因素的影响。可以使用cv.cvtColor函数将彩色图像转换为灰度图,如gray_target = cv.cvtColor(target_image, cv.COLOR_BGR2GRAY)。
  • 多目标匹配:如果目标图像中可能存在多个与模板匹配的目标,上述示例只是找到了最佳匹配位置。要找到所有匹配位置,可以设置一个阈值,当匹配程度(根据匹配方法得到的结果矩阵中的值)超过这个阈值时,就认为是一个匹配目标。然后通过遍历结果矩阵来找到所有满足阈值条件的位置,并标记出来。
  • 性能优化:当处理大尺寸图像或复杂模板时,模板匹配可能会比较耗时。可以考虑使用图像金字塔等技术来加速匹配过程,先在低分辨率的图像上进行粗匹配,然后在高分辨率图像上进行精匹配。

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

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

相关文章

doc、pdf转markdown

国外的一个网站可以: Convert A File Word, PDF, JPG Online 这个网站免费的,算是非常厚道了,但是大文件上传多了之后会扛不住 国内的一个网站也不错: TextIn-AI智能文档处理-图像处理技术-大模型加速器-在线免费体验 https://…

金融项目实战 06|Python实现接口自动化——日志、实名认证和开户接口

目录 一、日志封装及应用(理解) 二、认证开户接口脚本编写 1、代码编写 1️⃣api目录 2️⃣script目录 2、BeautifulSoup库 1️⃣简介及例子 2️⃣提取html数据工具封装 3、认证开户参数化 一、日志封装及应用(理解) &…

浅谈云计算15 | 存储可靠性技术(RAID)

存储可靠性技术 一、存储可靠性需求1.1 数据完整性1.2 数据可用性1.3 故障容错性 二、传统RAID技术剖析2.1 RAID 02.2 RAID 12.3 RAID 52.4 RAID 62.5 RAID 10 三、RAID 2.0技术3.1 RAID 2.0技术原理3.1.1 两层虚拟化管理模式3.1.2 数据分布与重构 3.2 RAID 2.0技术优势3.2.1 自…

Spring官网构建Springboot工程

注意:基于Idea的 Spring Initializr 快速构建 SpringBoot 工程时需要联网。 1.进入SpringBoot官网 Spring | Home 点击QUICKSTART 点击start.spring.io进入spring initializr 2.选择依赖 3.生成工程 下载好后解压用IDEAD导入即可。

计算机的错误计算(二百一十二)

摘要 利用两个大模型计算 实验表明,两个大模型均进行了中肯的分析。另外,其中一个大模型给出了 Python代码,运行后,结果中有7位错误数字;而一个大模型进行加减运算时出错。 例1. 计算 下面是与一个大模型的对话…

Vue+Echarts+百度地图 实现 路径规划

实现功能: 通过选择 相关调拨,系统自动规划 路径,并且以地图的形式呈现最佳路径 技术难点: 1. vue 结合使用 echarts 2.echarts 在 vue嵌入百度地图,并且做出路径 曲线 最终结果:

【算法】图解两个链表相交的一系列问题

问: 给定两个可能有环也可能无环的单链表,头节点head1和head2。请实现一个函数,如果两个链表相交,请返回相交的第一个节点;如果不相交,返回null。如果两个链表长度之和为N,时间复杂度请达到O(N…

Go-Zero整合Goose实现MySQL数据库版本管理

推荐阅读 【系列好文】go-zero从入门到精通(看了就会) 教程地址:https://blog.csdn.net/u011019141/article/details/139619172 Go-Zero整合Goose实现MySQL数据库版本管理的教程 在开发中,数据库迁移和版本管理是必不可少的工作。…

JAVA:Spring Boot 集成 JWT 实现身份验证的技术指南

1、简述 在现代Web开发中,安全性尤为重要。为了确保用户的身份,JSON Web Token(JWT)作为一种轻量级且无状态的身份验证方案,广泛应用于微服务和分布式系统中。本篇博客将讲解如何在Spring Boot 中集成JWT实现身份验证…

说一说mongodb组合索引的匹配规则

一、背景 有一张1000多万条记录的大表,需要做归档至历史表,出现了大量慢查询。 查询条件是 "classroomId": {$in: ["xxx", "xxx", ..... "xxx","xxx", "xxx" ] }耗时近5秒,且…

更新java

下载 Java 下载 |神谕 (oracle.com)

CSS3的aria-hidden学习

前言 aria-hidden 属性可用于隐藏非交互内容,使其在无障碍 API 中不可见。即当aria-hidden"true" 添加到一个元素会将该元素及其所有子元素从无障碍树中移除,这可以通过隐藏来改善辅助技术用户的体验: 纯装饰性内容,如…

【Java设计模式-5】装饰模式:给咖啡加点“佐料”

今天咱们要探索一下Java世界里的装饰模式(Decorator Pattern)。为了让这个过程更加生动易懂,咱们就以大家都熟悉的咖啡饮品来举例吧,想象一下,你就是那个咖啡大师,要给顾客调制出各种独特口味的咖啡哦&…

C++(5)

1.运算符重载 头文件 #ifndef MYSTRING_H #define MYSTRING_H#include <iostream> #include <cstring>using namespace std;class myString { private:char *str;//C风格字符串int size0; public:std::string s_str;//转换构造函数myString(const std::string &a…

K8S--配置存活、就绪和启动探针

目录 1 本人基础环境2 目的3 存活、就绪和启动探针介绍3.1 存活探针3.2 就绪探针3.3 启动探针 4 探针使用场景4.1 存活探针4.2 就绪探针4.3 启动探针 5 配置存活、就绪和启动探针5.1 定义存活探针5.2 定义一个存活态 HTTP 请求接口5.3 定义 TCP 的就绪探针、存活探测5.4 定义 g…

【HTML+CSS+JS+VUE】web前端教程-36-JavaScript简介

JavaScript介绍 JavaScript是一种轻量级的脚本语言&#xff0c;所谓脚本语言&#xff0c;指的是它不具备开发操作系统的能力&#xff0c;而是用来编写控制其他大型应用程序的“脚本” JavaScript是一种嵌入式语言&#xff0c;它本身提供的核心语法不算很多 为什么学习JavaScri…

LLM实现视频切片合成 前沿知识调研

1.相关产品 产品链接腾讯智影https://zenvideo.qq.com/可灵https://klingai.kuaishou.com/即梦https://jimeng.jianying.com/ai-tool/home/Runwayhttps://aitools.dedao.cn/ai/runwayml-com/Descripthttps://www.descript.com/?utm_sourceai-bot.cn/Opus Cliphttps://www.opu…

AI多模态论文解读:LLaVA-CoT:让视觉语言模型逐步推理

本文作者&#xff1a;AIGCmagic社区 猫先生 一、简 介 LLaVA-CoT引入了四个不同的阶段&#xff08;摘要、标题、推理和结论&#xff09;&#xff0c;使模型能够独立进行系统化的多阶段推理&#xff0c;显著提高了在推理密集型任务上的准确性。 编译了LLaVA-CoT-100k数据集&am…

分布式缓存redis

分布式缓存redis 1 redis单机&#xff08;单节点&#xff09;部署缺点 &#xff08;1&#xff09;数据丢失问题&#xff1a;redis是内存存储&#xff0c;服务重启可能会丢失数据 &#xff08;2&#xff09;并发能力问题&#xff1a;redis单节点&#xff08;单机&#xff09;部…

《C++11》nullptr介绍:从NULL说起

在C11之前&#xff0c;我们通常使用NULL来表示空指针。然而&#xff0c;NULL在C中有一些问题和限制&#xff0c;这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中&#xff0c;NULL实际上是一个整数0&#xff0c;而不是一个真正的…