当前位置: 首页 > news >正文

深入解析:计算机视觉——Opencv(模板匹配)

1.什么是模板匹配

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

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

2.例子

读取图像文件并显示

# 读取源图像(大图)
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 格式顺序不同)。

运行结果:

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

获取模板图像的尺寸

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

注释:

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

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

执行模板匹配算法

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()函数,该函数可以快速获取矩阵中的最小值、最大值,以及对应的坐标位置。

# 从匹配结果矩阵中获取最小值、最大值,以及对应的坐标位置
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对应的坐标。

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

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

绘制矩形框标记目标区域

# 在源图像上绘制绿色矩形框,标记最佳匹配区域
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,用于后续显示匹配结果。

显示匹配结果

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

运行结果:

http://www.jsqmd.com/news/444350/

相关文章:

  • 无线VR串流革命:ALVR技能深度解析与实践指南
  • Elasticsearch 索引生命周期管理ILM
  • OpenClaw 装机 1000 元?深度拆解代装产业链:谁在赚钱,谁在裸奔
  • UE5.7.3 AudioCapture
  • Elasticsearch:如何根据场景合理调整分片数量?
  • 装完 OpenClaw 之后,我把它变成了办公助手——一个月真实体验
  • 【工具推荐】WinRAR官网下载:2026最新WinRAR免费版安装图解教程 - xiema
  • 基于YOLO+DeepSeek+智能垃圾分类系统 Pytorch+SpringBoot+Flask+Vue 毕业设计的不同选题方向
  • 如何根据场景合理调整分片数量?
  • 如何在国内合规、稳定地使用GPT/Claude/Gemini API?中转服务全解析 - 实践
  • 三星Galaxy Book 6 Pro,平价高性能之选?
  • 医考面授培训机构哪家强? - 医考机构品牌测评专家
  • HBase Java API - 实践
  • 零基础执医笔试选哪个备考机构? - 医考机构品牌测评专家
  • 2026执医技能操作辅导机构哪家靠谱? - 医考机构品牌测评专家
  • 2026年ChatGPT Plus国内充值教程:支付宝微信代充卡密最稳方案亲测全解析
  • 零基础备考医考,面授培训课推荐选哪个? - 医考机构品牌测评专家
  • 临床执业医师老师推荐哪个? - 医考机构品牌测评专家
  • 经验分享:Tiktok小店需要外网吗?怎么入驻? - Roxy指纹浏览器
  • roxybrowser浏览器和紫鸟浏览器有什么区别?哪个更好用? - Roxy指纹浏览器
  • 3分钟搞懂深度学习AI:反向传播:链式法则的归责游戏
  • 软件研发 --- 通用编程学习流程
  • 深入解析:OpenClaw Clawdbot 自定义中转站配置教程!
  • 亚马逊防关联用哪个vps?防关联浏览器也可以用吗? - Roxy指纹浏览器
  • GPT - 5.4来袭,人类工作何去何从?
  • 哈希表- 快乐数两数之和四数相加II
  • roxybrowser浏览器和adspower浏览器有什么区别?哪个更好用? - Roxy指纹浏览器
  • 数据结构基础内容 + 顺序表 + 单链表的学习---嵌入式入门---Linux - 详解
  • 2026靠谱工业研学公司推荐,国内智能制造企业研学机构选择 - 品牌2026
  • 2026工业电源厂家怎么选 靠谱源头工厂选择 - 品牌2026