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() 算法的简单解释:
- 预处理:首先,将输入图像和模板图像转换为灰度图像。这是因为
cv.matchTemplate()算法只支持灰度图像。 - 滑动模板:然后,算法会在输入图像上滑动模板。对于每个位置(从左到右、从上到下呗),都会计算一个匹配分数。这个分数取决于当前位置的图像和模板的相似性。
- 计算匹配分数:根据选择的匹配方法,计算当前位置的匹配分数。例如,如果选择的是归一化相关系数方法,那么算法会计算输入图像和模板在当前位置的相关系数。其他方法,如归一化相关、平方差等,会有不同的计算方式。
- 找到最匹配的位置:在所有位置中,算法会找到匹配分数最高的位置。这个位置就是最匹配的位置。
- 返回结果:最后,函数会返回一个包含所有匹配区域信息的结构。这个结构包含了每个匹配区域的坐标、匹配分数等信息。
需要注意的是,由于滑动窗口的限制,如果模板和图像的某些区域不匹配,这些区域将不会被计入匹配分数。这是通过使用掩码(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 = 5def main():# 读取三张图global imgglobal templimg = cv.imread('data/lena_tmpl.jpg', cv.IMREAD_COLOR) # 图片1templ = cv.imread('data/tmpl.png', cv.IMREAD_COLOR) # 图片2global use_maskuse_mask = Trueglobal maskmask = cv.imread('data/mask.png', cv.IMREAD_COLOR ) # 图片3if ((img is None) or (templ is None) or (use_mask and (mask is None))):print('Can\'t read one of the images')return -1cv.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 0def MatchingMethod(param):global match_methodmatch_method = paramimg_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 = minLocelse: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

相关文章:
008 OpenCV matchTemplate 模板匹配
目录 一、环境 二、模板匹配算法原理 三、代码演示 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、模板匹配算法原理 cv.matchTemplate是OpenCV库中的一个函数,用于在图像中查找与模板匹配的特征。它的主要应用场景…...
PTA 海盗分赃
P 个海盗偷了 D 颗钻石后来到公海分赃,一致同意如下分赃策略: 首先,P 个海盗通过抽签决定 1 - P 的序号。然后由第 1 号海盗提出一个分配方案(方案应给出每个海盗分得的具体数量),如果能够得到包括 1 号在…...
零基础学Linux内核:1、Linux源码组织架构
文章目录 前言一、Linux内核的特征二、Linux操作系统结构1.Linux在系统中的位置2.Linux内核的主要子系统3、Linux系统主要数据结构 三、linux内核源码组织1、下载Linux源码2、Linux版本号3、linux源码架构目录讲解 前言 这里将是我们从零开始学习Linux的第一节,这节…...
STM32中Msp函数的意义
msp(MCU Support Package) 举个例子:串口初始化函数HAL_UART_Init()与串口底层初始化函数HAL_UART_MspInit() HAL_UART_Init()用于初始化串口通讯协议如波特率、有效位等 HAL_UART_MspInit()用于初始化于MCU相关的配置比如时钟、NVIC、GPI…...
PTA NeuDs_数据库题目
二.单选题 1.数据库应用程序的编写是基于数据库三级模式中的。 A.模式 B.外模式 C.内模式 D.逻辑模式 用户应用程序根据外模式进行数据操作,通过外模式一模式映射,定义和建立某个外模式与模式间的对应关系 2.对创建数据库模式一类的数据库对象的授权…...
pulseaudio是如何测试出音频延迟的
通常专业的音频设备生产厂商都有专业的设备来测试精确的音频链路延时。 那么没有专业设备怎么测试出音频延迟呢?如下图,我们可以看到pulseaudio可以测试出硬件音频延迟。 那么,他是怎么测试出硬件延迟的呢?他的理论依据是什么呢?接下来我带大伙一起探索一下。 /*占位…...
【docker】docker的基础命令
基础操作 docker info #查看docker的基本信息docker version #查看docker版本信息一、镜像操作 1、搜索镜像 docker search nginx2、下载镜像 docker pull nginx#从仓库中下载镜像,若没有指定标签,则下载最新的版本,也就是标签为: lat…...
RocketMq 主题(TOPIC)生产级应用
RocketMq是阿里出品(基于MetaQ)的开源中间件,已捐赠给Apache基金会并成为Apache的顶级项目。基于java语言实现,十万级数据吞吐量,ms级处理速度,分布式架构,功能强大,扩展性强。 官方…...
队列实现栈VS栈实现队列
目录 【1】用队列实现栈 思路分析 易错总结 Queue.c&Queue.h手撕队列 声明栈MyStack 创建&初始化栈myStackCreate 压栈myStackPush 出栈&返回栈顶元素myStackPop 返回栈顶元素myStackTop 判断栈空否myStackEmpty 释放空间myStackFree MyStack总代码…...
C/C++: 统计整数
【问题描述】 输入若干个整数,统计出现次数最多的那个整数。如果出现最多的整数有两个以上,打印最早输入的那个整数。 【输入形式】 从标准输入读取输入。第一行只有一个数字N(1≤N≤10000),代表整数的个数。以后的N行…...
docker容器生成镜像并上传个人账户
登录到 Docker Hub 账户: docker login这将提示你输入你的 Docker Hub 账户名和密码。 为容器创建镜像 docker commit <容器名或容器ID> <你的用户名>/<镜像名:标签>例子 docker commit my_container yourusername/my_image:latest推送镜像到…...
hdlbits系列verilog解答(exams/m2014_q4g)-48
文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本次我们将一次创建多个逻辑门,对两个输入a和b通过组合逻辑实现七种不同的输出: out_and: a and bout_or: a or bout_xor: a xor bout_nand: a nand bout_nor: a nor bout_xnor: a xnor bout_anotb: a and-no…...
在vue或者react或angular中,模板表达式中的箭头函数是无效的吗?为什么无效?
出现此问题的背景: 我在Angular项目中对一个标签属性绑定了一个箭头函数,编译报错。 在vue或者react或angular中,模板表达式中的箭头函数是无效的吗? 在 Vue、React 或 Angular 中,模板表达式中的箭头函数是无效的。…...
C++11『lambda表达式 ‖ 线程库 ‖ 包装器』
✨个人主页: 北 海 🎉所属专栏: C修行之路 🎃操作环境: Visual Studio 2022 版本 17.6.5 文章目录 🌇前言🏙️正文1.lambda表达式1.1.仿函数的使用1.2.lambda表达式的语法1.3.lambda表达式的使用…...
MATLAB算法实战应用案例精讲-【数模应用】漫谈机器学习(四)(附实战案例及代码实现)
目录 机器学习学习路线 学习编写抽象类 固定随机数种子 先加载少量数据...
JavaScript 中松散类型的理解
JavaScript 是一种动态类型语言,它的松散类型是其独特的特性之一。本文将深入探讨 JavaScript 中松散类型的概念以及如何在代码中应用。 引言 JavaScript 是一种强大而灵活的语言,它的松散类型使得变量的类型可以在运行时动态改变。这为开发人员带来了…...
java基于springboot公益帮学网站 新闻发布系统的设计与实现vue
以Java为开发平台,综合利用Java Web开发技术、数据库技术等,开发出公益帮学网站。用户使用版块:可以选择注册并登录,可以浏览信息、可以网上互动、发布文章、内容推荐等。后台管理员管理版块:以管理员身份登录网站后台…...
VMware 安装 Centos7 超详细过程
VMware 安装 Centos7 超详细过程 分类 编程技术 1.软硬件准备 软件:推荐使用 VMware,我用的是 VMware 12 镜像:CentOS6 ,如果没有镜像可以在阿里云下载 centos安装包下载_开源镜像站-阿里云 硬件:因为是在宿主机上运行虚拟化软…...
03:2440--UART
目录 一:UART 1:概念 2:工作模式 3:逻辑电平 4:串口结构图 5:时间的计算 二:寄存器 1:简单的UART传输数据 A:GPHCON--配置引脚 B:GPHUP----使能内部上拉编辑 C: UCON0---设置频率115200 D: ULCON0----数据格式8n1 E:发送数据 A:UTRSTAT0 B:UTXHO--发送数据输…...
Vatee万腾的科技冒险:Vatee独特探索力量的数字化征程
在数字化时代的激流中,Vatee万腾以其独特的科技冒险精神,引领着一场前所未有的数字化征程。这不仅仅是一次冒险,更是对未知的深度探索,将科技的力量推向新的高度。 Vatee万腾在科技领域敢于挑战传统,积极探索未知的可能…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
