14篇--模板匹配

server/2024/12/19 4:49:34/

原理

模板匹配就是用模板图(通常是一个小图)在目标图像(通常是一个比模板图大的图片)中不断的滑动比较,通过某种比较方法来判断是否匹配成功。

匹配方法

1. 平方差匹配TM_SQDIFF

以模板图与目标图所对应的像素值使用平方差公式来计算,其结果越小,代表匹配程度越高,计算过程举例如下。

注意:模板匹配过程皆不需要边缘填充,直接从目标图像的左上角开始计算。

 2. 归一化平方差匹配TM_SQDIFF_NORMED

与平方差匹配类似,只不过需要将值统一到0到1,计算结果越小,代表匹配程度越高,计算过程举例如下。

3.相关匹配TM_CCORR 

使用对应像素的乘积进行匹配,乘积的结果越大其匹配程度越高,计算过程举例如下。

4. 归一化相关匹配TM_CCORR_NORMED 

与相关匹配类似,只不过是将其值统一到0到1之间,值越大,代表匹配程度越高,计算过程如下。

 5. 相关系数匹配TM_CCOEFF

需要先计算模板与目标图像的均值,然后通过每个像素与均值之间的差的乘积再求和来表示其匹配程度,1表示完美的匹配,-1表示最差的匹配,计算过程举例如下。

6. 归一化相关系数匹配TM_CCOEFF_NORMED

也是将相关系数匹配的结果统一到0到1之间,值越接近1代表匹配程度越高,计算过程举例如下。

绘制轮廓 

找到符合要求的区域后,需要使用绘制轮廓组件将其在目标图像中绘制出来,通过记录下来的符合要求的区域位置与模板的宽和高,就能在目标图像中将模板框选出来。

示例代码

python">import cv2
import numpy as np# 1、读取原图 + 灰度化
img = cv2.imread("./ctrl.png")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 2、读取模板图 + 灰度化
template = cv2.imread("./basketball.jpg")
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
# 读取模板图的宽高
h, w = template_gray.shape[:2]# 3、进行模板匹配
# cv2.matchTemplate()返回值是一个和原图同等大小的二维数组,存储的不是像素值而是匹配程度
# 若使用了归一化,存储的就是0到1之间的浮点数值
ret = cv2.matchTemplate(img_gray,       # 参数1 原图template_gray,        # 参数2 模板图cv2.TM_CCOEFF_NORMED  # 参数3 匹配方法 6种)
# 设置一个匹配阈值,用于判断匹配程度大于多少才算匹配上
threshold = 0.8
# 调用np库中where函数
# 返回一个有两个array数组的元组,第一个元素是loc[0] y坐标,第二个元素是loc[1] x坐标
loc = np.where(ret >= threshold)
# 遍历匹配点
for x, y in zip(loc[1], loc[0]):# 绘制轮廓——矩形cv2.rectangle(img,              # 原图像(x, y),           # 左上角(x + w, y + h),   # 右下角(0, 0, 255),2)cv2.imshow('image', img)
cv2.imshow('template', template)
cv2.waitKey(0)


http://www.ppmy.cn/server/151359.html

相关文章

概率论得学习和整理25:EXCEL 关于直方图/ 频度图 /hist图的细节,2种做hist图的方法

目录 1 hist图的特点 2 hist的设置技巧:直接生成的hist图往往很奇怪不好用:因为横轴的分组不对 3 如何修改分组 4 设置开放边界,把长尾合并,得到hist图1 5 用原始表得到频数表 6 用上面的频数图做柱状图,再修改&…

蓝桥杯刷题——day4

蓝桥杯刷题——day4 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 小蓝和朋友们在玩一个报数游戏。由于今年是2024 年,他们决定要从小到大轮流报出是20或24倍数的正整数。前10个被报出的数是:20,24,40,48,60,72,80,96,100,120。请问第2…

《探秘开源气味数据库:数字世界里的“气味宝藏”》

《探秘开源气味数据库:数字世界里的“气味宝藏”》 一、开源气味数据库的兴起背景(一)技术发展的推动(二)市场需求的催生 二、常见的开源气味数据库介绍(一)GS-LF 香精香料数据库(二…

Htpp中web通讯发送post(上传文件)、get请求

一、正常发送post请求 1、引入pom文件 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5</version></dependency>2、这个是发送至正常的post、get请求 import org…

LVGL9.2 鼠标悬停处理

文章目录 前言鼠标悬停处理功能简介使用场景1. **按钮悬停效果**2. **图标高亮**3. **动态工具提示** 实现原理使用方法1. 设置控件样式2. 监听悬停事件 功能亮点注意事项总结 前言 在 v9.2 版本中&#xff0c;新增了许多功能&#xff0c;其中鼠标悬停处理&#xff08;Mouse H…

React 基础:剖析 UI 描述之道

目录 介绍编写你的第一个组件定义组件使用组件组件的导入与导出 使用JSX代替HTMLJSX规则JSX中通过大括号使用JS 将 Props 传递给组件向组件传递props使用 JSX 展开语法传递 props将JSX作为子组件传递 条件渲染条件返回JSX三目运算符与运算符 渲染列表对数组进行过滤并渲染数据用…

Linux高性能服务器编程中的TCP带外数据梳理总结

Linux高性能服务器编程中的TCP带外数据梳理总结 文章目录 Linux高性能服务器编程中的TCP带外数据梳理总结1.TCP 带外数据总结2.第五章带外数据send.crecv.c 3.第九章带外数据send.cselect.c 4.第十章带外数据send.csig_msg.c 1.TCP 带外数据总结 至此&#xff0c;我们讨论完了…

RPM(Red Hat Package Manager)的功能解析

RPM 是一种用于 Linux 系统的软件包管理器&#xff0c;主要用于安装、升级、查询、验证、卸载和管理软件包。 1. RPM 的基本功能 1.1 软件包安装 安装新软件包。安装时会自动检查依赖关系&#xff0c;提示需要的依赖。命令&#xff1a; rpm -ivh package.rpm参数说明&#xf…