做机器视觉项目时,模板匹配可能是很多人接触过的第一个算法。
读取一张图片,截取一个模板,调用 OpenCV 接口,再把匹配位置画出来。
十几行代码,就能看到结果。
但当我真正想把它做成一个可以反复使用的软件时,才发现事情没有这么简单。
模板从哪里来?
每次使用时都要重新截图吗?
模板参数怎么保存?
目标旋转以后还能不能匹配?
不同尺寸的目标怎么处理?
匹配出多个结果以后,分数、位置、角度和尺度在哪里查看?
于是,我花了一些时间,把原本零散的模板匹配代码整理成了一套基于 Qt 和 OpenCV 的离线模板匹配工具。
它不是一个完整的产线视觉系统,也没有接入工业相机、PLC 或 MES。
它目前专注于一件事情:
把模板匹配从一个算法 Demo,整理成一套可以运行、可以制作模板、可以保存参数、可以重复加载和继续二次开发的软件工具。
先看一下实际效果
下面这张图中,待检测图片里有多个尺寸、角度不同的齿轮。
软件执行匹配后,会在图像上绘制匹配框和中心点,同时显示每个结果的匹配分数。

从结果可以看到,目标发生旋转后,软件仍然可以返回匹配位置。
右侧参数面板中,可以设置:
- 最低匹配分数;
- 最大匹配数量;
- 最大重叠率;
- 角度起点和终点;
- 角度步长;
- 尺度范围;
- 尺度步长;
- 算法相关参数。
底部还会显示本次匹配耗时。
对于一个单纯的算法 Demo,这些功能可能不重要。
但对于一个真正需要反复测试和调参的小工具,它们非常重要。
为什么我没有只写一个简单的 matchTemplate
很多 OpenCV 模板匹配示例,流程通常是这样的:
读取图片;
截取模板;
执行匹配;
画出矩形框;
显示结果。
作为入门示例,这完全没有问题。
但只要稍微往实际使用方向走一步,就会遇到很多细节。
例如:
- 模板不能每次都重新截图;
- ROI 不能永远只是一个固定矩形;
- 模板区域过大,会把背景带进去;
- 模板区域过小,目标边缘可能不完整;
- 不同算法需要不同参数;
- 匹配结果不能只画一个框,还要显示分数、角度和尺度;
- 参数调好后,下次打开软件应该能够继续使用。
所以,我没有把所有逻辑都堆在一个按钮里,而是按照实际操作流程拆成了几个部分:
这样用起来会更清楚。
软件目前有哪些功能?
目前,这套工具支持以下功能:
- 加载本地待检测图片;
- 制作模板;
- 保存模板文件;
- 加载已有模板;
- 设置匹配分数阈值;
- 设置匹配数量;
- 设置角度搜索范围;
- 设置尺度搜索范围;
- 显示匹配位置;
- 显示匹配中心点;
- 显示分数、角度、尺度和坐标;
- 保存匹配结果图片;
- 查看匹配耗时。
软件中目前提供了两类匹配方式:
Fast NCC
更适合灰度细节比较稳定、纹理信息比较明显的目标。
例如字符、Logo、表面纹理和固定图案。
Shape Based
更关注边缘和轮廓。
对于纹理不明显,但形状比较稳定的目标,更容易发挥作用。
不同场景适合使用不同算法,所以软件中保留了统一的参数入口和切换方式。
模板制作,不只是随便框一个区域
模板匹配的效果,很大程度取决于模板本身。
如果 ROI 框得太大,背景也会参与匹配。
如果 ROI 框得太小,目标边缘可能会被裁掉。
如果模板特征太少,后续匹配容易不稳定。
因此,我单独做了一个模板制作窗口。

左侧用于选择 ROI,右侧实时显示模板效果。
目前支持:
- 矩形 ROI;
- 可旋转矩形 ROI;
- 圆形 ROI。
在制作模板时,还可以调整:
- ROI 外扩边距;
- Mask 膨胀和腐蚀;
- 最大特征点数量;
- 最小梯度;
- 亮度归一化。
右侧会实时显示:
- 模板图像;
- 有效区域;
- 特征点分布;
- 有效像素数量;
- 对比度;
- 模板质量提示。
这样做的好处是,模板是否合适,不需要等到匹配失败以后才发现。
在制作阶段,就可以看到特征点是不是落在了目标轮廓上。
模板保存以后,下次可以直接加载
很多简单的模板匹配示例,只保存一张模板图片。
但在实际使用中,仅仅保存图片还不够。
因为模板通常还包含:
- ROI 类型;
- ROI 位置;
- Mask;
- 制作参数;
- 特征点;
- 匹配算法;
- 匹配参数。
所以我设计了一个模板文件,用来保存这些信息。
制作完成后,可以直接保存模板。
下次打开软件时,不需要重新框选 ROI,也不需要重新调一遍参数,直接加载模板文件即可继续使用。
这也是我认为这个项目比较有实用价值的地方。
它不只是“跑一次算法”,而是把模板制作和复用流程完整地串了起来。
匹配结果不只是在图上画一个框
执行匹配以后,结果会同时显示在图像和表格中。

图像中会绘制:
- 匹配矩形框;
- 中心点;
- 结果编号;
- 匹配分数。
表格中会显示:
- 分数;
- 角度;
- 尺度;
- X、Y 坐标;
- 宽度;
- 高度。
这样在测试不同参数时,可以更方便地比较结果。
旋转目标也可以测试
下面这张图中,目标存在明显的角度变化。



软件可以根据设置的角度范围和角度步长,搜索不同方向的目标。
从结果表格中,也可以看到每个目标对应的角度和分数。
对于轮廓类目标,这类旋转搜索比较实用。
也可以做最简单的单目标定位
如果图像中只有一个目标,也可以只返回最佳匹配结果。
【插入图片 5:单目标匹配结果图】
对于初学者来说,这个例子也比较容易理解:
先制作模板,再加载另一张图片,最后定位目标位置。
从一个简单示例开始,再逐步测试旋转、尺度和多个目标,会更容易理解模板匹配的完整流程。
这套软件适合哪些人?
这套工具目前是一个离线版本,更适合以下几类用途:
- 学习 Qt 和 OpenCV 图像处理;
- 学习模板匹配基本流程;
- 测试不同图片的模板匹配效果;
- 了解 ROI、Mask 和特征点的作用;
- 学习模板保存和加载;
- 作为 Qt 图像处理工具的二次开发基础;
- 作为其他视觉软件功能模块的参考。
需要说明的是:
这不是一套已经接入产线的完整视觉系统。
目前版本不包含:
- 工业相机采集;
- PLC 通信;
- MES 对接;
- 连续检测流程;
- 产品配方管理;
- 现场部署相关功能。
但对于学习、测试和二次开发来说,目前的功能已经比较完整。
软件运行版如何获取?
如果你想先体验软件,可以评论区回复模板匹配或转发文章
给博主获取。
- Windows 可运行版本;
- 示例图片;
- 简单操作说明。
源码发布时间
项目源码将在:6 月 16 日发 开源单独发布。近期我需要整理一下注释和相关资料
对源码感兴趣的朋友,可以先关注公众号。
最后
模板匹配本身并不是一个新算法。
真正让我感兴趣的是:怎样把一个算法能力,整理成别人可以直接使用的软件流程。
从加载图片,到制作模板;
从 ROI 绘制,到特征点预览;
从参数调整,到模板保存;
从执行匹配,到结果展示。
每一步都不复杂。
但当这些步骤完整串起来以后,一个简单的 OpenCV Demo,才真正变成了一套可以使用的小工具。
如果你在使用过程中遇到问题,可以留言交流。
如果你希望在现有工具基础上增加功能,或者需要开发其他 Qt、OpenCV、图像处理和机器视觉软件,也可以联系博主进行评估。


