欢迎光临
我们一直在努力

我把 OpenCV 模板匹配做成了一套 Qt 软件

做机器视觉项目时,模板匹配可能是很多人接触过的第一个算法。

读取一张图片,截取一个模板,调用 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、图像处理和机器视觉软件,也可以联系博主进行评估。

    赞(0)
    未经允许不得转载:171主机测评 » 我把 OpenCV 模板匹配做成了一套 Qt 软件
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址