模板匹配matchTemplate

定义 :模板匹配是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最终将匹配度最高的区域选择为最终的结果。
原理 :将模板块每次移动一个像素(从左往右,从上往下),在每一个位置,都计算与模板图像的相似程度。对于每一个位置将计算的相似结果保存在结果矩阵®中。如果输入图像的大小(WxH)且模板图像的大小(wxh),则输出矩阵R的大小为(W-w +1,H-h+1)将R显示为图像。获得图像后,查找最大值所在的位置,那么该位置对应的区域就被认为是最匹配的。对应的区域就是以该点为顶点,长宽和模板图像一样大小的矩阵。
案例

API

python 复制代码
res = cv.matchTemplate(img,template,method)
img:要进行模板匹配的图像
Template:模板
实现模板匹配的算法,主要有method:
1.平方差匹配(cv2.TM_SQDIFF_NORMED):利用模板与图像之间的平方差进行匹配最好的匹配是0,匹配越差,匹配的值越大。
2.相关匹配(cv2.TM_CCORR_NORMED):利用模板与图像间的乘法进行匹配,数值越大表示匹配程度较高,越小表示匹配效果差,
3.利用相关系数匹配(cv2.TM_CCOEFF_NORMED):利用模板与图像间的相关系数匹配,1表示完美的匹配,-1表示最差的匹配。

完成匹配后,使用cv.minMaxLoc()方法查找最大值所在的位置即可。如果使用平方差作为比较方法,则最小值位置是最佳匹配位置。
单个对象匹配

python 复制代码
import cv2 as cv2
img = cv2.imread('11.png')    #(781, 1314, 3)数组
template = cv2.imread('kg.png') #(109, 110, 3)
h, w = template.shape[:2]  ##参照物体宽高
# 匹配模板
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED) #(673, 1205)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# 计算矩形左边
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
# 画矩形
cv2.rectangle(img, top_left, bottom_right, (0, 255, 0), 5)
#cv.rectangle(img,leftupper,rightdown,color,thickness)
#img:要绘制矩形的图像
#Leftupper, rightdown:矩形的左上角和右下角坐标
#color: 线条的颜色
#Thickness: 线条宽度
# 展示结果
cv2.imshow('img_rgb', img)
cv2.waitKey(0)

多个对象匹配

python 复制代码
import cv2
import numpy as np

# 读取目标图像和模板图像
img = cv2.imread('11.png')
template = cv2.imread('tp.png')

# 获取模板图像的宽度和高度
h, w = template.shape[:2]

# 模板匹配
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)

# 设置匹配的阈值,通常在0.8~1.0之间
threshold = 0.75  
loc = np.where(res >= threshold)

# 绘制匹配的矩形框并统计匹配数量
count = 0
for pt in zip(*loc[::-1]):  # 将匹配结果的坐标反转,以便用于cv2.rectangle
    cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)
    count += 1
# 显示结果
cv2.putText(img, f"Found {count} objects", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
#cv.putText(img,text,station, font, fontsize,color,thickness,cv.LINE_AA)
#img: 图像
#text:要写入的文本数据
#station:文本的放置位置
#font:字体
#Fontsize :字体大小
#cv.LINE_AA:避免图像线段锯齿型
cv2.imshow('Detected', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
相关推荐
cici158741 小时前
二值化断裂裂缝的智能拼接算法
人工智能·算法·计算机视觉
测试人社区-小明4 小时前
智能测试误报问题的深度解析与应对策略
人工智能·opencv·线性代数·微服务·矩阵·架构·数据挖掘
Coding茶水间5 小时前
基于深度学习的肾结石检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
图像处理·人工智能·深度学习·yolo·目标检测·机器学习·计算机视觉
雍凉明月夜6 小时前
视觉opencv学习笔记Ⅴ-数据增强(1)
人工智能·python·opencv·计算机视觉
这张生成的图像能检测吗6 小时前
(论文速读)Nickel and Diming Your GAN:通过知识蒸馏提高GAN效率的双重方法
人工智能·生成对抗网络·计算机视觉·知识蒸馏·图像生成·模型压缩技术
donkey_19937 小时前
ShiftwiseConv: Small Convolutional Kernel with Large Kernel Effect
人工智能·深度学习·目标检测·计算机视觉·语义分割·实例分割
再__努力1点8 小时前
【68】颜色直方图详解与Python实现
开发语言·图像处理·人工智能·python·算法·计算机视觉
啊阿狸不会拉杆9 小时前
《数字图像处理》第 3 章 - 灰度变换与空间滤波
图像处理·人工智能·算法·计算机视觉·数字图像处理
啊阿狸不会拉杆9 小时前
《数字图像处理 》 第 1 章-绪论
图像处理·python·opencv·算法·数字图像处理
UpYoung!9 小时前
【截图与贴图工具推荐】截图与贴图工具——PixPin保姆级详细图文下载安装指南
图像处理·贴图·实用工具·图像编辑·截图工具·开源工具·运维必备