OpenCV-Python(24):模板匹配

news2024/11/17 14:52:02

原理及介绍

        模板匹配是一种常用的图像处理技术,它用于在一幅图像中寻找与给定模板最匹配的区域(在一副大图中搜寻查找模版图像位置的方法)。模板匹配的基本思想是将模板图像在目标图像上滑动,并计算它们的相似度,找到相似度最高的位置即为匹配位置。

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 = 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()函数进行模板匹配,得到匹配结果。然后,我们设置了一个匹配阈值,只有匹配结果低于该阈值的位置才会被认为是匹配的位置。最后,我们在目标图像上绘制矩形框来表示匹配位置。需要注意的是,多对象模板匹配可能存在重叠的情况,因此在实际应用中,可能需要进行进一步的处理来区分不同的目标对象。

效果如下:

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

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

相关文章

uniapp:签字版、绘画板 插件l-signature

官方网站&#xff1a;LimeUi - 多端uniapp组件库 使用步骤&#xff1a; 1、首先从插件市场将代码下载到项目 海报画板 - DCloud 插件市场 2、下载后&#xff0c;在项目中的uni_modules目录 3、最后 没有其它步骤&#xff0c;直接官网代码复制到vue文件中就可以了&#xff0c…

坐标转换 | EXCEL中批量将经纬度坐标(EPSG:4326)转换为墨卡托坐标(EPSG:3857)

1 需求 坐标系概念&#xff1a; 经纬度坐标&#xff08;EPSG:4326&#xff09;&#xff1a;WGS84坐标系&#xff08;World Geodetic System 1984&#xff09;是一种用于地球表面点的经纬度坐标系。它是美国国防部于1984年建立的&#xff0c;用于将全球地图上的点定位&#xff0…

25计算机专业考研经验贴之准备篇

Hello各位小伙伴&#xff0c;大家新年好&#xff01; 马上就要进入寒假假期了&#xff0c;25考研也该提上日程了。今天先跟大家分享一下大家在假期可以先做起来的准备工作。 【选择学校】 择校是个非常重要的内容&#xff0c;因为不同学校的考试内容是不一样的&#xff0c;有些…

CNN——LeNet

1.LeNet概述 LeNet是Yann LeCun于1988年提出的用于手写体数字识别的网络结构&#xff0c;它是最早发布的卷积神经网络之一&#xff0c;可以说LeNet是深度CNN网络的基石。 当时&#xff0c;LeNet取得了与支持向量机&#xff08;support vector machines&#xff09;性能相…

数据库进阶教学——主从复制(Ubuntu22.04主+Win10从)

目录 一、概述 二、原理 三、搭建 1、备份数据 2、主库配置Ubuntu22.04 2.1、设置阿里云服务器安全组 2.2、修改配置文件 /etc/my.cnf 2.3、重启MySQL服务 2.4、登录mysql&#xff0c;创建远程连接的账号&#xff0c;并授予主从复制权限 2.5、通过指令&#xff0c;查…

Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架

目录 一、FastAPI框架概述 二、FastAPI与Flask和Tornado的性能对比 1、路由性能 2、请求处理性能 3、内存占用 三、FastAPI的优点与特色 四、代码示例 五、注意事项 六、结论 在当今的软件开发领域&#xff0c;快速、高效地构建API成为了许多项目的关键需求。为了满足…

k8s快速搭建

VMware16Pro虚拟机安装教程VMware16.1.2安装及各版本密钥CentOS7.4的安装包:提取码&#xff1a;lp6qVMware搭建Centos7虚拟机教程 搭建完一个镜像 关机 拍摄一个快照,克隆两个作为子节点 0. 环境准备 在开始之前&#xff0c;部署Kubernetes集群机器需要满足以下几个条件&#…

实验笔记之——基于Linux服务器复现Instant-NGP及常用的tmux指令

之前博客实现了基于windows来复现Instant-NGP&#xff0c;本博文在linux服务器上测试 实验笔记之——基于windows复现Instant-NGP-CSDN博客文章浏览阅读444次&#xff0c;点赞15次&#xff0c;收藏7次。之前博客对NeRF-SLAM进行了调研&#xff0c;本博文先复现一下Intant-NGP。…

【Matlab】PSO-BP 基于粒子群算法优化BP神经网络的数据时序预测(附代码)

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/88689096 一&#xff0c;概述 PSO-BP算法是一种结合了粒子群算法&#xff08;PSO&#xff09;和BP神经网络的方法&#xff0c;用于数据时序预测。下面是PSO-BP算法的原理和过程&#xff1a; 1. 数据准备&…

elasticsearch如何操作索引库里面的文档

上节介绍了索引库的CRUD&#xff0c;接下来操作索引库里面的文档 目录 一、添加文档 二、查询文档 三、删除文档 四、修改文档 一、添加文档 新增文档的DSL语法如下 POST /索引库名/_doc/文档id(不加id,es会自动生成) { "字段1":"值1", "字段2&q…

印象笔记02: 笔记本管理系统和空间使用

印象笔记02&#xff1a; 笔记本管理系统和空间使用 印象笔记新建笔记是一件非常容易的事情。笔记多了&#xff0c;就是归纳到笔记本里。 印象笔记一共有三层的笔记结构&#xff1a;最高层级是笔记本组&#xff0c;其次是笔记本&#xff0c;最后是一个个的笔记。合理的分类能够…

HbuilderX中的git的使用

原文链接https://blog.csdn.net/Aom_yt/article/details/119924356

PS 2024全新开挂神器Portraiture v4.1.2升级版,功能强大,一键安装永久使用

关于PS修图插件&#xff0c;相信大家都有安装过使用过&#xff0c;而且还不止安装了一款&#xff0c;比如最为经典的DR5.0人像精修插件&#xff0c;Retouch4me11合1插件&#xff0c;Portraiture磨皮插件&#xff0c;这些都是人像精修插件中的领跑者。 其中 Portraiture 刚刚升…

魔棒无人直播系统有哪些优势?

随着科技的发展&#xff0c;越来越多新鲜事物的出现&#xff0c;它们代替了我们做很多的事情&#xff0c;开始解放着自己的双手&#xff0c;其中&#xff0c;无人直播的出现&#xff0c;就让直播变得更加简单。 因为是无人直播&#xff0c;所以全程不需要真人出镜&#xff0c;…

探索Java的魅力

从本篇文章开始&#xff0c;小编准备写一个关于java基础学习的系列文章&#xff0c;文章涉及到java语言中的基础组件、实现原理、使用场景、代码案例。看完下面一系列文章&#xff0c;希望能加深你对java的理解。 本篇文章作为本系列的第一篇文章&#xff0c;主要介绍一些java…

【Mybatis】Mybatis如何防止sql注入

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1、使用参数化的 SQL 语句&#xff1a; 2、使用动态 SQL 标签&#xff1a; 3、禁止拼接 SQL&#xff1a; 4、限制参数类…

dmetl5授权查看与更新

1.查看dmetl5授权到期时间 需要登录管理端&#xff0c;菜单栏选择“管理”-“license管理”即可查看授权到期时间。如下图&#xff1a; 2.dmetl5更新授权的方法 dmetl5的<安装目录>\scheduler\config路径下&#xff0c;默认会有一个trail.key的文件&#xff0c;删除后&am…

Ribbon相关面试及答案(2024)

1、Ribbon是什么&#xff0c;它在微服务架构中扮演什么角色&#xff1f; Ribbon是一个客户端负载均衡器&#xff0c;它在微服务架构中扮演着关键性的角色。Ribbon的设计理念是在客户端进行服务发现和负载均衡&#xff0c;这种方式不同于传统的通过中心化的负载均衡器&#xff…

案例216:基于微信小程序的垃圾分类系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

【macOS】将macOS安装到U盘,让它在U盘/SSD启动运行

将macOS安装到U盘&#xff0c;让它在U盘/SSD启动运行。 1.从AppStore下载macOS&#xff1b; 2.双击下载的安装包文件&#xff1a; 例如&#xff1a;我下载的是&#xff1a;macOS 14.x 文件名&#xff1a;安装macOS Sonoma 文件位置&#xff1a;/Application/ 【注意】&…