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

OpenCV(二十)模板匹配

目录一、基础理论1、作用与过程2、原理3、函数matchTemplate二、代码三、效果参考资料一、基础理论1、作用与过程所谓的模板匹配,就是在给定的图

目录

一、基础理论

1、作用与过程

2、原理

3、函数matchTemplate

二、代码

三、效果

参考资料




一、基础理论


1、作用与过程

        所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板图片,整个任务的思路就是:按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最终将匹配度最高的区域选择为最终的结果


2、原理

如果输入图像的大小为(WxH),而模板图像的大小为(wxh),则输出图像的大小将为(W-w + 1,H-h + 1)。得到结果后,可以使用cv.minMaxLoc()函数查找最大/最小值在哪,将其作为矩形的左上角,并以(w,h)作为矩形的宽度高度。该矩形是您模板的区域


3、函数matchTemplate


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

image: 输入图像
templ: 输入模板
method: 方法
        TM_SQDIFF: 计算平方差, 计算出来的值越小, 越相关
        TM_CCORR: 计算相关性, 计算出来的值越大, 越相关
        TM_CCOEFF: 计算相关系数, 计算出来的值越大, 越相关
        TM_SQDIFF_NORMED: 计算归一化平方不同, 计算出来的值越接近 0, 越相关
        TM_CCORR_NORMED: 计算归一化相关性, 计算出来的值越接近 1, 越相关
        TM_CCOEFF_NORMED: 计算归一化系数, 计算出来的值越接近 1, 越相关



二、代码

#模板匹配
import cv2
import os# 1、读取图片 并转化为灰度图(不可以用彩图匹配)
img = cv2.imread("Resource/test11.jpg")# 2、读取模板
template = cv2.imread("Resource/template.jpg")
w, h, c = template.shape #获得模板长宽# 3、模板匹配
rectangle = cv2.matchTemplate(img, template, cv2.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(rectangle)
#最小值 最大值 最小值坐标 最大值坐标# 4、获取匹配模块的左上角和右下角
top_left = max_loc #左上角
bottom_right = (top_left[0]+w, top_left[1]+h) #右下角# 5、画矩形并显示
cv2.rectangle(img, top_left, bottom_right, (0,0,255), 2)
cv2.imshow("matching", img)cv2.waitKey(0)
cv2.destroyAllWindows()


三、效果

原图         模板: 

匹配结果:

  

拓展∶模板匹配不适用于尺度变换视角变换后的图像,这时我们就要使用关键点匹配算法,比较经典的关键点检测算法包括SIFTSURF等,主要的思路是首先通过关键点检测算法获取模板和测试图片中的关键点﹔然后使用关键点匹配算法处理即可,这些关键点可以很好的处理尺度变化、视角变换、旋转变化、光照变化等,具有很好的不变性。


参考资料

https://iamarookie.blog.csdn.net/article/details/119096602

https://www.bilibili.com/video/BV1Fo4y1d7JL?p=39&spm_id_from=pageDriver


推荐阅读
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文介绍如何通过注册表编辑器自定义和优化Windows文件右键菜单,包括删除不需要的菜单项、添加绿色版或非安装版软件以及将特定应用程序(如Sublime Text)添加到右键菜单中。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 汇编语言等号伪指令解析:探究其陡峭的学习曲线
    汇编语言以其独特的特性和复杂的语法结构,一直被认为是编程领域中学习难度较高的语言之一。本文将探讨汇编语言中的等号伪指令及其对初学者带来的挑战,并结合社区反馈分析其学习曲线。 ... [详细]
  • Python实现照片磨皮效果
    本文介绍如何使用Python和OpenCV库来实现照片的磨皮效果,使图片更加平滑并提升整体美感。 ... [详细]
  • 如何彻底清除顽固软件如360
    本文详细介绍了如何彻底卸载难以删除的软件,如360安全卫士。这类软件不仅难以卸载,还会在开机时启动多个应用,影响系统性能。我们将提供两种有效的方法来帮助您彻底清理这些顽固软件。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 深入剖析 DEX 赛道:从 60 大头部项目看五大趋势
    本文通过分析 60 大头部去中心化交易平台(DEX),揭示了当前 DEX 赛道的五大发展趋势,包括市场集中度、跨链协议、AMM+NFT 结合、新公链崛起以及稳定币和衍生品交易的增长潜力。 ... [详细]
  • Redis Hash 数据结构详解
    本文详细介绍了 Redis 中的 Hash 数据类型及其常用命令。Hash 类型用于存储键值对集合,支持多种操作如插入、查询、更新和删除字段值。此外,文章还探讨了 Hash 类型在实际业务场景中的应用,并提供了优化建议。 ... [详细]
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社区 版权所有