(纯新手教学)计算机视觉(opencv)实战十二——模板匹配(cv2.matchTemplate)


模板匹配详解

一、概念与应用场景

模板匹配(Template Matching)是一种在大图中查找小图(模板)的常见方法。其基本思路是:将一张待搜索图像与一个模板图像进行滑动比对,通过计算相似度来确定模板在大图中的最佳匹配位置。

应用场景包括:

  • 在屏幕截图中查找按钮、图标的位置。

  • 在工业检测中匹配特定零件的轮廓。

  • 在图像识别任务中定位局部目标。


二、核心函数:cv2.matchTemplate

OpenCV 提供了 cv2.matchTemplate 函数来实现模板匹配。

复制代码
cv2.matchTemplate(image, templ, method, result=None, mask=None)

参数说明:

  • image:待搜索的图像(通常比模板大)。

  • templ:模板图像,需要在大图中被搜索的目标。

  • method:匹配方法,用来衡量相似度。

  • result:存放匹配结果的矩阵,一般不用手动传入,函数会自动生成。

  • mask:掩膜,可选参数,某些方法不支持。


三、常见匹配方法

模板匹配的效果依赖于所选择的计算方式。OpenCV 提供了六种主要方法:

  1. TM_SQDIFF(平方差匹配法)

    • 使用平方差衡量误差。

    • 匹配越好,结果值越小。

  2. TM_CCORR(相关匹配法)

    • 采用乘法运算,计算图像与模板的相关性。

    • 数值越大表示匹配程度越高。

  3. TM_CCOEFF(相关系数匹配法)

    • 通过相关系数计算相似度,排除了亮度影响。

    • 数值越大说明匹配效果越好。

  4. TM_SQDIFF_NORMED(归一化平方差匹配法)

    • 与 TM_SQDIFF 类似,但结果被归一化。

    • 匹配越好,值越小。

  5. TM_CCORR_NORMED(归一化相关匹配法)

    • 在 TM_CCORR 的基础上进行归一化,结果范围更稳定。

    • 数值越大,匹配越好。

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

    • 在 TM_CCOEFF 的基础上进行归一化,最常用的一种方法。

    • 结果范围通常在 -1 到 1 之间,越接近 1 匹配越好。


四、结果的解析与定位

执行 cv2.matchTemplate 后,得到的 res 是一个二维矩阵,矩阵中的每个元素表示模板在该位置下与原图的匹配程度。

要获取最佳匹配位置,可以使用 cv2.minMaxLoc

复制代码
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
  • min_val / max_val:匹配值的最小值和最大值。

  • min_loc / max_loc:最小值和最大值所在的位置坐标。

具体选取 min_loc 还是 max_loc,取决于所使用的匹配方法:

  • 平方差方法 (TM_SQDIFF、TM_SQDIFF_NORMED) → 使用最小值位置 min_loc

  • 相关与相关系数方法 (其余方法) → 使用最大值位置 max_loc


五、绘制匹配结果

当找到最佳匹配位置后,可以根据模板的宽度和高度在原图上绘制矩形框,标记匹配区域:

复制代码
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
kele_template = cv2.rectangle(kele, top_left, bottom_right, color=(0, 255, 0), thickness=2)

其中:

  • top_left:匹配矩形的左上角坐标。

  • bottom_right:匹配矩形的右下角坐标。

  • color :矩形颜色,这里为绿色 (0,255,0)

  • thickness:线条粗细。


六、完整代码解析

所给代码实现了完整的模板匹配流程:

  1. 读取图像

    复制代码
    import cv2
    
    kele = cv2.imread('kele.png')
    template = cv2.imread('template.png')
    cv2.imshow('kele',kele)
    cv2.imshow('template',template)
    cv2.waitKey(0)

    kele.png 为待搜索的大图,template.png 为模板。

  2. 获取模板尺寸

    复制代码
    h, w = template.shape[:2]

    得到模板的高度和宽度,用于后续绘制矩形。

  3. 执行模板匹配

    复制代码
    res = cv2.matchTemplate(kele, template, cv2.TM_CCOEFF_NORMED)

    使用归一化相关系数法进行匹配。

  4. 定位最佳匹配位置

    复制代码
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    top_left = max_loc

    由于采用的是相关系数方法,因此取最大值位置。

  5. 绘制矩形框

    复制代码
    bottom_right = (top_left[0] + w, top_left[1] + h)
    kele_template = cv2.rectangle(kele, top_left, bottom_right, color=(0, 255, 0), thickness=2)
  6. 结果展示

    复制代码
    cv2.imshow('kele_template',kele_template)
    cv2.waitKey(0)

    将匹配结果以绿色矩形框显示出来。


七、注意事项

  1. 模板大小影响结果:模板过大或过小都会导致匹配不准。

  2. 光照和角度问题:当图像存在光照变化、旋转、缩放时,传统模板匹配可能失效。

  3. 多目标匹配:若需要查找多个匹配位置,可以对结果矩阵进行阈值筛选,而不是只取最大值或最小值。

  4. 方法选择

    • 对亮度敏感的情况,应使用相关系数法(CCOEFF)。

    • 当需要更稳定的匹配结果时,推荐使用归一化方法。


八、总结

模板匹配是一种直观、易用的目标检测方法,适用于固定目标、尺度不变的场景。通过 cv2.matchTemplatecv2.minMaxLoc 的组合,可以快速实现目标的定位与标记。虽然在复杂场景中可能受光照、旋转等因素影响,但在特定应用中依然是高效实用的工具。

相关推荐
leisoo809711 分钟前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
WangYan202221 分钟前
基于XGBoost与AI的生态—地学多源数据建模:植被与土地利用识别、土壤碳氮空间预测、生物多样性驱动机制、土壤微生物功能预测、生态退化与风险识别
python·机器学习·xgboost
不会代码的小猴1 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
一只旭宝2 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
金銀銅鐵3 小时前
[Python] 借助 turtle 逐字展示唐诗《金缕衣》
python
coder!mq4 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding4 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言
Lhan.zzZ4 小时前
在 Visual Studio 2022 中打造可扩展的动态链接库模块:从零搭建到原理解析
开发语言·c++·visual studio
心平气和量大福大4 小时前
android-实例-蒲公英-更新与安装-5-签名与生成APK
android·java·开发语言
码哥DFS4 小时前
构造函数、实例对象、对象原型 ----三者关系
开发语言·javascript·原型模式