008 OpenCV matchTemplate 模板匹配

目录

一、环境

二、模板匹配算法原理

三、代码演示


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、模板匹配算法原理

cv.matchTemplate是OpenCV库中的一个函数,用于在图像中查找与模板匹配的特征。它的主要应用场景是在图像处理、计算机视觉和模式识别等领域。

算法原理: cv.matchTemplate函数通过计算输入图像与模板图像之间的相似度来找到最佳匹配位置。它使用滑动窗口的方法在输入图像上移动模板图像,并计算每个窗口内的像素值差异。然后,根据所选的匹配方法(如平方差、归一化平方差、相关系数等),对差异进行加权求和,得到一个匹配得分矩阵。最后,函数返回得分矩阵中的最大值及其位置,作为最佳匹配位置。

函数API:

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

参数说明:

  • image:输入图像,通常是一个灰度图像。
  • templ:模板图像,可以是灰度图像或彩色图像。
  • method:匹配方法,常用的有:
    • cv2.TM_SQDIFF:平方差匹配法,计算结果越小表示匹配程度越高。
    • cv2.TM_SQDIFF_NORMED:归一化平方差匹配法,计算结果越接近0表示匹配程度越高。
    • cv2.TM_CCORR:相关系数匹配法,计算结果越接近1表示匹配程度越高。
    • cv2.TM_CCORR_NORMED:归一化相关系数匹配法,计算结果越接近1表示匹配程度越高。
    • cv2.TM_CCOEFF:相关系数匹配法,计算结果越接近1表示匹配程度越高。
    • cv2.TM_CCOEFF_NORMED:归一化相关系数匹配法,计算结果越接近1表示匹配程度越高。
  • mask:可选参数,mask是一个二值图,作用于参数temp1,有效区域则参与模板匹配计算

返回值说明:

  • result:匹配结果矩阵,每个元素表示对应位置的匹配程度。
  • minVal, maxVal, minLoc, maxLoc:最佳匹配位置的最小值、最大值、最小值位置和最大值位置。

下面是对 cv.matchTemplate() 算法的简单解释:

  1. 预处理:首先,将输入图像和模板图像转换为灰度图像。这是因为 cv.matchTemplate() 算法只支持灰度图像。
  2. 滑动模板:然后,算法会在输入图像上滑动模板。对于每个位置(从左到右、从上到下呗),都会计算一个匹配分数。这个分数取决于当前位置的图像和模板的相似性。
  3. 计算匹配分数:根据选择的匹配方法,计算当前位置的匹配分数。例如,如果选择的是归一化相关系数方法,那么算法会计算输入图像和模板在当前位置的相关系数。其他方法,如归一化相关、平方差等,会有不同的计算方式。
  4. 找到最匹配的位置:在所有位置中,算法会找到匹配分数最高的位置。这个位置就是最匹配的位置。
  5. 返回结果:最后,函数会返回一个包含所有匹配区域信息的结构。这个结构包含了每个匹配区域的坐标、匹配分数等信息。

需要注意的是,由于滑动窗口的限制,如果模板和图像的某些区域不匹配,这些区域将不会被计入匹配分数。这是通过使用掩码(mask)参数实现的。掩码是一个与模板大小相同的二维数组,值可以是0或1。在掩码中为1的位置将被计入匹配分数,为0的位置则不会被计入。

总的来说,cv.matchTemplate() 是一个强大的工具,可以用于在图像中查找和模板最匹配的区域。它广泛应用于图像处理、计算机视觉和模式识别等领域。

三、代码演示

代码中需要的三张图,这里给出来,lena_tmpl.jpg,以下是原图:

tmpl.png,以下是模板图,意思是:在原图中找到与其相似的区域,用矩形画出来。

mask.png,必须与tmp1.png尺寸相同,是一个二值图,用于表示:模板计算过程中,模板图中哪些区域用于模板匹配。

from __future__ import print_function
import sys
import cv2 as cv

# 全局变量
use_mask = False
img = None
templ = None
mask = None
image_window = "Source Image"
result_window = "Result window"

match_method = 0
max_Trackbar = 5

def main():
    # 读取三张图
    global img
    global templ
    img = cv.imread('data/lena_tmpl.jpg', cv.IMREAD_COLOR) # 图片1
    templ = cv.imread('data/tmpl.png', cv.IMREAD_COLOR) # 图片2

    global use_mask
    use_mask = True
    global mask
    mask = cv.imread('data/mask.png', cv.IMREAD_COLOR ) # 图片3

    if ((img is None) or (templ is None) or (use_mask and (mask is None))):
        print('Can\'t read one of the images')
        return -1
    cv.namedWindow( image_window, cv.WINDOW_AUTOSIZE )
    cv.namedWindow( result_window, cv.WINDOW_AUTOSIZE )
    # 创建滑条
    trackbar_label = 'Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED'
    cv.createTrackbar( trackbar_label, image_window, match_method, max_Trackbar, MatchingMethod )
    # 执行模板匹配
    MatchingMethod(match_method)
    cv.waitKey(0)
    return 0

def MatchingMethod(param):
    global match_method
    match_method = param
    img_display = img.copy()
    # 模板匹配
    method_accepts_mask = (cv.TM_SQDIFF == match_method or match_method == cv.TM_CCORR_NORMED)
    if (use_mask and method_accepts_mask):
        result = cv.matchTemplate(img, templ, match_method, None, mask)
    else:
        result = cv.matchTemplate(img, templ, match_method)
    # 将结果进行归一化到[0, 1]
    cv.normalize( result, result, 0, 1, cv.NORM_MINMAX, -1 )
    # 找到最佳匹配
    _minVal, _maxVal, minLoc, maxLoc = cv.minMaxLoc(result, None)
    # 得到的匹配位置,即:一个矩形框
    if (match_method == cv.TM_SQDIFF or match_method == cv.TM_SQDIFF_NORMED):
        matchLoc = minLoc
    else:
        matchLoc = maxLoc
    # 可视化
    cv.rectangle(img_display, matchLoc, (matchLoc[0] + templ.shape[0], matchLoc[1] + templ.shape[1]), (0,255,0), 2, 8, 0 )
    cv.rectangle(result, matchLoc, (matchLoc[0] + templ.shape[0], matchLoc[1] + templ.shape[1]), (0,0,255), 2, 8, 0 )
    cv.imshow(image_window, img_display)
    cv.imshow(result_window, result)
    pass
if __name__ == "__main__":
    main()

以下是不同算法运行效果,哪些算法吊,一眼就能看出来,自己可以玩一玩哈。

\n 0: SQDIFF

\n 1: SQDIFF

\n 2: TM CCORR

\n 3: TM CCORR

\n 4: TM COEFF

\n 5: TM COEFF

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++_String增删查改模拟实现

C_String增删查改模拟实现 前言一、string默认构造、析构函数、拷贝构造、赋值重载1.1 默认构造1.2 析构函数1.3 拷贝构造1.4 赋值重载 二、迭代器和范围for三、元素相关:operator[ ]四、容量相关:size、resize、capacity、reserve4.1 size、capacity4.2…

Django ORM 执行复杂查询的技术与实践

概要 Django ORM(Object-Relational Mapping)是 Django 框架的核心组件之一,提供了一种高效、直观的方式来处理数据库操作。尽管简单查询在 Django ORM 中相对容易实现,但在面对复杂的数据请求时,需要更深入的了解和技…

西米支付:游戏支付的概念,发展,什么是游戏支付接口?

游戏支付平台是指专门用于游戏交易的在线支付系统。它为玩家提供了方便快捷的支付服务,让他们能够在游戏中购买虚拟物品、充值游戏币等。 游戏支付平台通过安全的支付通道和多种支付方式,保障了交易的安全性和便捷性。 同时,它也为游戏开发…

webGL开发微信小游戏

WebGL 是一种用于在浏览器中渲染 2D 和 3D 图形的 JavaScript API。微信小游戏本质上是在微信环境中运行的基于 Web 技术的应用,因此你可以使用 WebGL 来开发小游戏。以下是基于 WebGL 开发微信小游戏的一般步骤,希望对大家有所帮助。北京木奇移动技术有…

java ssh 二手车交易管理系统eclipse开发mysql数据库MVC模式java编程网页设计

一、源码特点 JSP ssh 二手车交易管理系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用 B/S模式开发。开发环境为TOMCAT…

麻雀搜索优化算法MATLAB实现,SSA-BP网络

对于麻雀搜索算法的介绍,网上已经有不少资料了,这边公布SSA的matlab实现 下面展示SSA算法的核心代码以及详细注解 % 麻雀搜索算法函数定义 % 输入:种群大小(pop),最大迭代次数(Max_iter),搜索空间下界(lb)&#xff0c…

CPSC发布关于亚马逊含有纽扣电池或硬币电池产品的相关规则标准!UL4200A

2023年9月21日,美国消费品安全委员会(CPSC)在《联邦公报》上发布了纽扣及硬币电池及相关产品的最终规则(DFR)16 CFR 1263,以保护6岁以下儿童免受电池摄入危害。DFR将于2023年10月23日生效,除非消…

低代码!小白用10分钟也能利用flowise构建AIGC| 业务问答 | 文本识别 | 网络爬虫

一、与知识对话 二、采集网页问答 三、部署安装flowise flowise工程地址:https://github.com/FlowiseAI/Flowise flowise 官方文档:https://docs.flowiseai.com/ 这里采用docker安装: step1:克隆工程代码 (如果网络…

redis之主从复制和哨兵模式

(一)redis的性能管理 1、redis的数据缓存在内存中 2、查看redis的性能:info memory(重点) used_memory:904192(单位字节) redis中数据占用的内存 used_memory_rss:10522624 redis向操作系统…

阿里云高校计划学生认证领无门槛代金券和教师验证方法

阿里云高校计划扫码完成学生验证即可领取300元无门槛代金券,还可领取3折优惠折扣,适用于云服务器等全量公共云产品,订单原价金额封顶5000元/年,阿里云服务器网aliyunfuwuqi.com分享阿里云高校计划入口及学生认证说明: …

【Redis篇】简述Redis | 详解Redis命令

文章目录 🎍什么是Redis🎍Redis特点🎍Redis应用场景🍔Windows安装Redis⭐启动Redis 🌺Redis数据类型🌺Redis常用命令⭐字符串string操作命令⭐哈希hash操作命令⭐列表list操作命令⭐集合set操作命令⭐有序集…

第十一章 目标检测中的NMS(工具)

精度提升 众所周知,非极大值抑制NMS是目标检测常用的后处理算法,用于剔除冗余检测框,本文将对可以提升精度的各种NMS方法及其变体进行阶段性总结。 总体概要: 对NMS进行分类,大致可分为以下六种,这里是依…

稳定性保障8个锦囊,建议收藏!

稳定性保障,是一切技术工作的出发点和落脚点,也是 IT 工作最核心的价值体现,当然也是技术人员最容易“翻车”的阴沟。8个稳定性保障锦囊,分享给各位技术人员择机使用。 #1 设定可量化的、业务可理解的可用性目标 没有度量就没有改…

vue diff算法原理以及v2v3的区别

diff算法简介 diff算法的目的是为了找到哪些节点发生了变化,哪些节点没有发生变化可以复用。如果用最传统的diff算法,如下图所示,每个节点都要遍历另一棵树上的所有节点做比较,这就是o(n^2)的复杂度,加上更新节点时的…

系列六、ThreadLocal内存泄漏案例

一、内存泄漏 vs 内存溢出 内存泄漏:内存泄漏是指程序中已经动态分配的堆内存由于某种原因程序未释放或者无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至导致系统崩溃等严重后果,内存泄漏最终 会导致内…

2023年中国宠物清洁用品分类、市场规模及发展特征分析[图]

宠物清洁用品指专用于清洁宠物毛发、口腔、耳部、脚爪等部位的各类宠物用品,包括宠物香波、滴耳露、修毛刀等。宠物主对宠物清洁用品需求的出现,一定程度上反映出部分宠物主与宠物间的感情逐渐加深,并逐渐达到了较为亲密的程度。随着宠物清洁…

掌握技术访谈:CNN、Seq2Seq、Faster R-CNN 和 PPO — 揭开卓越编码和创新之路

一、说明 本文 揭开CNN、Seq2Seq、Faster R-CNN 和 PPO — 编码和创新之路。对于此类编程的短小示例,用于开发时临时参考。 二、数据准备 问题陈述:在本次挑战中,您将深入计算机视觉世界并使用卷积神经网络 (CNN) 解决图像分类任务。您将使用…

electron入门(一)环境搭建,实现样例

1、首先需要安装git和node,配置环境变量,确保npm和git命令可用 2、 然后安装依赖 npm install -g electronnpm install -g electron-forgenpm install -g electron-prebuilt-compile3、 创建样例工程 electron-forge init my-new-app # 我这里碰见报错…

深度学习入门:自建数据集完成花鸟二分类任务

自建数据集完成二分类任务(参考文章) 1 图片预处理 1 .1 统一图片格式 找到的图片需要首先做相同尺寸的裁剪,归一化,否则会因为图片大小不同报错 RuntimeError: stack expects each tensor to be equal size, but got [3, 667…

如何使用环境变量运行bat脚本(开启数据库db)

文章目录 1.拥有一个bat脚本2. 右击本电脑,点击属性,找到高级设置3.新建一个环境变量命名为你想要的名字4. 找到Path,进入新增%m8%即可5.确认所有刚刚的操作,并关闭开始配置后的所有页面6.notice 1.拥有一个bat脚本 内容是执行mys…