14篇--模板匹配

embedded/2024/12/21 19:40:47/

原理

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

匹配方法

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/embedded/147610.html

相关文章

android、flutter离线推送插件,支持oppo、vivo、小米、华为

项目说明 项目地址:https://github.com/haomiao33/ym_flutter_push 起因 目前github上面搜索发现没有合适的flutter和android 推送原生插件,所以自己参考和借鉴了(https://github.com/taoweiji/MixPush)项目,这个mixpush太老了&#xff0c…

JVM(Java虚拟机)分区详情

JVM(Java虚拟机)运行时数据区是Java虚拟机的内存管理模型,它包括了多个关键的内存区域,这些区域各自承担着不同的职责,共同支持着Java程序的运行。以下是JVM运行时数据区的详细介绍: 一、整体概述 JVM运行时数据区按照线程占用的情况可以分为两类:线程共享和线程独享。…

Day41 动态规划part08

股票问题是一个动态规划的系列问题,前两题并不难,第三题有难度。 121. 买卖股票的最佳时机 视频讲解:动态规划之 LeetCode:121.买卖股票的最佳时机1_哔哩哔哩_bilibili 代码随想录 方法1:贪心算法 class Solution {public int maxProfit(int[] prices) {int low = Intege…

CS 144 check3: the TCP sender

Lecture Notes 略 Exercises 现在,在check3中,您将实现连接的另一边。 TCPSender是一种工具,它从出站字节流转换为将成为不可靠数据报的有效负载的段。 TCP sender的任务是确保receiver至少收到每个bytes一次。任务: 1、跟踪…

跨站脚本攻击(XSS)可能存在的位置与实操演示

免责申明 本文仅是用于学习研究XSS攻击的原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》【学法时习之丨网络安全在身边一图了解网络安全法_中央网络安…

图文社区用户搜索关系表设计方案:空间换时间的权衡与抉择

背景 我们来聊一个解决方案:我们做了一个和抖音产品类似的图文社区,社区有一个搜索栏,通过名字搜索用户,搜索出来的用户需要体现出其与当前用户的关系:1.当前用户的粉丝。2.当前用户关注的人。3.互相关注。目前总用户…

CPU性能优化-基于源代码的CPU调优

一 在第二部分,我们将讨论如何使用CPU监控特性寻找CPU上运行的代码中可被调优的位置。对于性能敏感型应用程序,如大型分布式云服务,科学高性能计算软件,3A 级游戏等,了解底层硬件的工作原理是非常重要的。若在程序开发…

11篇--图像边缘检测

图像梯度 要学习图像边缘检测,要先了解图像梯度的概念,我们正是通过梯度值来区分边缘像素点的 处于边缘附近的像素点与周围像素点的差距很大(不然不会有边缘呈现),所以给边缘附近的的梯度之变化很快,通过…