热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OpenCV笔记:cv2.matchTemplate()单模板匹配和多模板匹配

导读模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。模板匹配实现简单(2~3行代码),计算效率高,不需要执行阈值化、边


导读

        模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。

        模板匹配实现简单(2~3行代码),计算效率高,不需要执行阈值化、边缘检测等操作来生成二值化图像。但是:如果输入图像中存在变化的因素,包括旋转、缩放、视角变化等,模板匹配很容易就会失效。除非:输入图像的旋转、缩放、视角变化在恒定的情况下,模板匹配也可以完美发挥作用。

        你可能需要的文章:


  • OpenCV笔记:cv2.matchTemplate()、cv2.minMaxLoc() 、cv2.rectangle() 方法介绍
  • 关于:Python基础,爬虫,机器学习,常见异常和面试【篇】(专题汇总)



正文

        OpenCV 为我们提供了函数: cv2.matchTemplate() 用于实现模板匹配,并使用 cv2.minMaxLoc() 计算匹配结果。

        至于模板的匹配方法,这里不做详细介绍,需要的小伙伴可以查看:【导读】你可能需要的文章。


一、单模板匹配


1.1 图片准备

        之前的教程里,我一直匹配“脸部”这种特征明显的图形,所以本讲换一个思路,匹配更容易混淆的衣服部分。玩个游戏吧,大家可以看看下面的图片取自哪里,看看是你快,还是机器学习快。


  • 底图 image(博客首页的图),模板图片 templ 如下:

         注意:模板图片要从模板图片中截出来使用,如果二者分辨率差距太大,很容易匹配失败。


1.2 代码展示

# _*_coding:utf-8_*_
# 作者: Java Punk
# 时间: 2022-10-09 14:49:45import cv2 as cv2# 单个模板匹配
def one_match(image, templ):img = cv2.imread(image)template = cv2.imread(templ)h, w = template.shape[:2]# 匹配模板res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)# 计算矩形左边top_left = max_locbottom_right = (top_left[0] + w, top_left[1] + h)# 画矩形cv2.rectangle(img, top_left, bottom_right, (0, 0, 255), 5)# 展示结果cv2.imshow('img_rgb', img)cv2.waitKey(0)passif __name__ == '__main__':print("———————————————————— start ————————————————————\n")# 图片路径自己设置,下面是我本地的路径,记得替换!!!one_match('../img/test/guimie_03.jpg', '../img/test/guimie_04.jpg')print("———————————————————— end ————————————————————\n")

1.3 效果展示

        完美匹配到了,我的模板就是从这里接出来的。




二、多模板匹配

     上面的单模板匹配使用了函数 cv2.minMaxLoc() 输出结果,特点是:只会输出一个匹配系数最大值,无法给出所有匹配区域的位置信息。但是,有些情况下,要搜索的模板图像很有可能在输入图像内出现了多次,这时就需要找出多个匹配结果。

        多模板匹配引入了“匹配系数” - threshold,利用数学计算函数 numpy 删选出所有大于 threshold 的图形。


2.1 图片准备 


  • 模板图片 templ → 底图 image:


2.2 代码展示

# _*_coding:utf-8_*_
# 作者: Java Punk
# 时间: 2022-10-09 14:49:45import cv2 as cv2
import numpy as np# 多个模板匹配
def more_match(image, templ):img = cv2.imread(image)img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)template = cv2.imread(templ, 0)h, w = template.shape[:2]res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)# 取匹配程度大于%90的坐标threshold = 0.9# np.where返回的坐标值(x,y)是(h,w),注意h,w的顺序loc = np.where(res >= threshold)for pt in zip(*loc[::-1]):bottom_right = (pt[0] + w, pt[1] + h)cv2.rectangle(img, pt, bottom_right, (255, 0, 0), 1)print(pt, bottom_right)cv2.imshow('img_rgb', img)cv2.waitKey(0)passif __name__ == '__main__':print("———————————————————— start ————————————————————\n")# 图片路径自己设置,下面是我本地的路径,记得替换!!!more_match('../img/test/zhipai_03.jpg', '../img/test/zhipai_04.jpg')print("———————————————————— end ————————————————————\n")

2.3 效果展示

        要知道,即使是从原图上截取的图片,在做视觉匹配的时候有没有100%匹配的说法,只能是无限接近于100%。代码中 threshold = 0.9,即:90%以上匹配,尝试将匹配系数慢慢增大,看看会发生什么?

        注:为了让每个菱形有区别,我特意倾斜了一定角度拍摄了纸牌的照片,多少能展示出一点效果。

        当 threshold = 0.99 的时候,结果只有一个(的确就是我取的截图),即:输出最匹配的结果,在原理上与 函数 cv2.minMaxLoc() 有异曲同工之妙。




推荐阅读
  • Python 中 json.dumps() 和 json.loads() 的使用方法详解——Python 面试与 JavaScript 面试必备知识
    在 Python 中,`json.dumps()` 和 `json.loads()` 是处理 JSON 数据的核心函数。`json.dumps()` 用于将字典或其他可序列化对象转换为 JSON 格式的字符串,而 `json.loads()` 则用于将 JSON 字符串解析为 Python 对象。本文详细介绍了这两个函数的使用方法及其在 Python 和 JavaScript 面试中的重要性,帮助读者掌握这些关键技能。 ... [详细]
  • 本文深入解析了Python在处理HTML过滤时的实现方法及其应用场景。通过具体实例,详细介绍了如何利用Python代码去除HTML字符串中的标签和其他无关信息,确保内容的纯净与安全。此外,文章还探讨了该技术在网页抓取、数据清洗等领域的实际应用,为开发者提供了宝贵的参考。 ... [详细]
  • Hyperledger Fabric 1.4 节点 SDK 快速入门指南
    本文将详细介绍如何利用 Hyperledger Fabric 1.4 的 Node.js SDK 开发应用程序。通过最新版本的 Fabric Node.js SDK,开发者可以更高效地构建和部署基于区块链的应用,实现数据的安全共享和交易处理。文章将涵盖环境配置、SDK 安装、示例代码以及常见问题的解决方法,帮助读者快速上手并掌握核心功能。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • Java解析YAML文件并转换为JSON格式(支持JSON与XML的结构化查询)
    本文探讨了如何利用Java解析YAML文件并将其转换为JSON格式,同时支持JSON和XML的结构化查询。YAML、JSON和XML这三种数据格式通过其名称作为文件扩展名,便于区分和使用。文章详细介绍了这些格式的层次结构和数据表示方法,并重点讨论了在数据传输过程中,XML的特性和优势。此外,还提供了具体的代码示例和实现步骤,帮助开发者高效地进行数据格式转换和查询操作。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 每年,意甲、德甲、英超和西甲等各大足球联赛的赛程表都是球迷们关注的焦点。本文通过 Python 编程实现了一种生成赛程表的方法,该方法基于蛇形环算法。具体而言,将所有球队排列成两列的环形结构,左侧球队对阵右侧球队,首支队伍固定不动,其余队伍按顺时针方向循环移动,从而确保每场比赛不重复。此算法不仅高效,而且易于实现,为赛程安排提供了可靠的解决方案。 ... [详细]
  • 提升 Kubernetes 集群管理效率的七大专业工具
    Kubernetes 在云原生环境中的应用日益广泛,然而集群管理的复杂性也随之增加。为了提高管理效率,本文推荐了七款专业工具,这些工具不仅能够简化日常操作,还能提升系统的稳定性和安全性。从自动化部署到监控和故障排查,这些工具覆盖了集群管理的各个方面,帮助管理员更好地应对挑战。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 如何使用mysql_nd:Python连接MySQL数据库的优雅指南
    无论是进行机器学习、Web开发还是爬虫项目,数据库操作都是必不可少的一环。本文将详细介绍如何使用Python通过 `mysql_nd` 库与 MySQL 数据库进行高效连接和数据交互。内容涵盖以下几个方面: ... [详细]
  • a16z深入解析:代币设计的常见误区、优化策略及未来趋势分析
    a16z深入解析:代币设计的常见误区、优化策略及未来趋势分析 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 为了评估精心优化的模型与策略在实际环境中的表现,Google对其实验框架进行了全面升级,旨在实现更高效、更精准和更快速的在线测试。新的框架支持更多的实验场景,提供更好的数据洞察,并显著缩短了实验周期,从而加速产品迭代和优化过程。 ... [详细]
author-avatar
济南谷幽兰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有