热门标签 | 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 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 优化局域网SSH连接延迟问题的解决方案
    本文介绍了解决局域网内SSH连接到服务器时出现长时间等待问题的方法。通过调整配置和优化网络设置,可以显著缩短SSH连接的时间。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文探讨了如何在给定整数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环境下的配置与测试。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 汇编语言等号伪指令解析:探究其陡峭的学习曲线
    汇编语言以其独特的特性和复杂的语法结构,一直被认为是编程领域中学习难度较高的语言之一。本文将探讨汇编语言中的等号伪指令及其对初学者带来的挑战,并结合社区反馈分析其学习曲线。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 如何彻底清除顽固软件如360
    本文详细介绍了如何彻底卸载难以删除的软件,如360安全卫士。这类软件不仅难以卸载,还会在开机时启动多个应用,影响系统性能。我们将提供两种有效的方法来帮助您彻底清理这些顽固软件。 ... [详细]
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社区 版权所有