计算机视觉--Opencv(模板匹配)

1.什么是模板匹配

模板匹配是一种用于查找与模板图像(补丁)匹配(相似)的图像区域的技术。

具体来说,模板匹配需要准备两张图:一张是源图像(也叫输入图像) ,也就是我们要从中寻找目标的完整大图;另一张是模板图像,也就是我们要找的目标物体的单独截图。算法会将模板图像像一个 "滑动窗口" 一样,在源图像上从左到右、从上到下依次滑动遍历,每滑动到一个位置,就会通过特定的计算方法,判断该位置的图像与模板图像的匹配程度,最终找到匹配程度最高的位置,也就是目标物体在源图像中的所在之处。

2.例子

读取图像文件并显示

python 复制代码
# 读取源图像(大图)
kele = cv2.imread(r"C:\Users\LEGION\Desktop\fcea1b9725d1a0aff1ea41d925fbf14a.png")
# 读取模板图像(要寻找的小目标图)
template = cv2.imread(r"C:\Users\LEGION\Desktop\efe68a20282e52dfbc1141e0adfce72a.png")
cv2.imshow(  'kele',kele)
cv2.imshow( 'template',template)
cv2.waitKey(0)

注意:

函数返回值是一个三维 NumPy 数组(对于彩色图像),数组的形状为(高度,宽度,通道数),其中通道数默认是 3(BGR 格式,这是 OpenCV 的默认图像格式,与我们常见的 RGB 格式顺序不同)。

运行结果:

就是有一个左上角显示的图片(模板图像),我们将把它与源图像(大图)进行模板匹配

获取模板图像的尺寸

python 复制代码
# 获取模板图像的高度(h)和宽度(w),shape[:2]表示取前两个维度(高度、宽度)
h, w = template.shape[:2]

注释:

  • 对于彩色图像,template.shape返回的是(h, w, 3),其中h是图像的高度(对应矩阵的行数),w是图像的宽度(对应矩阵的列数),3 是通道数。

  • 我们使用shape[:2]截取前两个维度,即可快速获取模板图像的高度和宽度,赋值给变量hw,为后续绘制矩形框做准备。

执行模板匹配算法

python 复制代码
res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)
#返回匹配结果的矩阵,其中每个元素表示该位置与模板的匹配程度
#cv2.minMaxLoc可以获取矩阵中的最小值和最大值,以及最小值的索引号和最大值的索引号

注释:

  • cv2.matchTemplate()函数有三个核心参数:

    1. 第一个参数:源图像(大图),即我们要从中寻找目标的图像。

    2. 第二个参数:模板图像(小图),即我们要寻找的目标图像,其尺寸必须小于或等于源图像的尺寸。

    3. 第三个参数:匹配方法(模板匹配的计算准则),OpenCV 提供了 6 种常用的匹配方法,本次使用的cv2.TM_CCOEFF_NORMED是归一化的相关系数匹配方法,也是实际应用中最常用的方法之一,其匹配结果值的范围在[-1, 1]之间,值越接近 1,表示匹配程度越高。

  • 函数的返回值res是一个二维 NumPy 数组(匹配结果矩阵),其形状为(H - h + 1, W - w + 1),其中HW是源图像的高度和宽度,hw是模板图像的高度和宽度。

寻找最佳匹配位置

得到匹配结果矩阵后,我们需要从中找到匹配程度最高的位置,这里使用cv2.minMaxLoc()函数,该函数可以快速获取矩阵中的最小值、最大值,以及对应的坐标位置。

python 复制代码
# 从匹配结果矩阵中获取最小值、最大值,以及对应的坐标位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
  • cv2.minMaxLoc()函数的参数是一个二维数组(匹配结果矩阵res),返回值是一个元组,包含四个元素,依次是:

    1. min_val:矩阵中的最小值。

    2. max_val:矩阵中的最大值。

    3. min_loc:最小值对应的坐标位置(元组类型,格式为(x, y),对应图像的列和行,即宽度和高度方向)。

    4. max_loc:最大值对应的坐标位置(格式同上)。

  • 由于我们使用的是cv2.TM_CCOEFF_NORMED归一化相关系数匹配方法,匹配程度越高,值越接近 1,因此最佳匹配位置就是max_loc对应的坐标,这个坐标是模板图像在源图像中最佳匹配区域的左上角坐标。

  • 注意:不同的匹配方法,最佳匹配位置对应的是最小值还是最大值有所不同。例如cv2.TM_SQDIFF(平方差匹配方法),值越接近 0 匹配程度越高,此时最佳匹配位置就是min_loc对应的坐标。

计算匹配区域的右下角坐标

python 复制代码
# 最佳匹配区域的左上角坐标
top_left = max_loc
# 计算最佳匹配区域的右下角坐标:左上角x+模板宽度,左上角y+模板高度
bottom_right = (top_left[0] + w, top_left[1] + h)

绘制矩形框标记目标区域

python 复制代码
# 在源图像上绘制绿色矩形框,标记最佳匹配区域
kele_template = cv2.rectangle(kele, top_left, bottom_right, (0, 255, 0), 2)

cv2.rectangle()函数用于在图像上绘制矩形,核心参数说明:

  1. 第一个参数:要绘制矩形的目标图像(这里是源图像kele)。

  2. 第二个参数:矩形的左上角坐标(top_left)。

  3. 第三个参数:矩形的右下角坐标(bottom_right)。

  4. 第四个参数:矩形的颜色,格式为(B, G, R)(OpenCV 默认图像格式为 BGR),这里(0, 255, 0)表示绿色。

  5. 第五个参数:矩形边框的宽度(单位:像素),传入正数表示绘制空心矩形,传入 - 1 表示绘制实心矩形(填充整个矩形区域)。

注意:该函数会直接在传入的图像上进行修改,同时也会返回修改后的图像矩阵,这里我们将返回值赋值给kele_template,用于后续显示匹配结果。

显示匹配结果

python 复制代码
# 显示标记了匹配区域的图像
cv2.imshow('kele_template', kele_template)
# 等待用户按键,关闭窗口
cv2.waitKey(0)

运行结果:

相关推荐
美酒没故事°18 小时前
Open WebUI安装指南。搭建自己的自托管 AI 平台
人工智能·windows·ai
云烟成雨TD18 小时前
Spring AI Alibaba 1.x 系列【6】ReactAgent 同步执行 & 流式执行
java·人工智能·spring
AI攻城狮19 小时前
用 Obsidian CLI + LLM 构建本地 RAG:让你的笔记真正「活」起来
人工智能·云原生·aigc
鸿乃江边鸟19 小时前
Nanobot 从onboard启动命令来看个人助理Agent的实现
人工智能·ai
lpfasd12319 小时前
基于Cloudflare生态的应用部署与开发全解
人工智能·agent·cloudflare
俞凡19 小时前
DevOps 2.0:智能体如何接管故障修复和基础设施维护
人工智能
comedate19 小时前
[OpenClaw] GLM 5 关于电影 - 人工智能 - 的思考
人工智能·电影评价
财迅通Ai19 小时前
6000万吨产能承压 卫星化学迎来战略窗口期
大数据·人工智能·物联网·卫星化学
liliangcsdn19 小时前
Agent Memory智能体记忆系统的示例分析
数据库·人工智能·全文检索
GISer_Jing19 小时前
Page-agent MCP结构
前端·人工智能