基于形状的模板匹配(用于字符识别)研究

时间:2024-03-14 13:53:17

一、各模板匹配方法对比

1、基于灰度的匹配一般被称为模版匹配,直接以灰度进行匹配效果不好,对光照很敏感,所以一般会以灰度归一化互相关(NCC)作为匹配依据,增强光照变化下的鲁棒性,为了降低计算量,多采用图像金字塔来实现先粗后精的方式加快匹配速度,匹配出像素位置后,会进一步做亚像素插值,使匹配出的位置达到更高的精度,处理旋转和缩放也很直接,就是在限定的角度范围和缩放比例内,取一定的步长生成多张模版,一一进行匹配。模版匹配处理遮挡比较困难,对光照变化想当敏感,如果有遮挡,一般情况下就不好使了。
2、基于特征的匹配一般称为图像配准,这方面的论文很多很多,当然现在的已不是研究热点,至少二维的情况是这样,三维以及高维的间或会冒出来那么一两篇。基于特征的匹配,就如你所写的那样,提取特征点,用算法迭代求出相互匹配的特征,求出这些匹配特征点之间的变换关系。处理旋转缩放也很直接,选用具有仿射或投影不变性的特征即可。基于特征的匹配,对光照不太敏感,也可以一定程度上处理遮挡,提速和提高精度的方法和模版匹配里提到的基本相同,当然如果图像中提取不到足够多的特征点的话,这个方法就很难奏效了。
3、还有匹配方法是基于几何形状信息,就是提取模版中的边缘和梯度,梯度方向等图像高频的部分,作为匹配的依据,对抗旋转缩放,提速,提高精度也和上面的类似。这一部分完整公开可用的代码很少,几乎没有,opencv里也没涉及,但这个算法被绝大多数商业库采用,因为它可以在光照变化,形变以及遮挡的情况下达到很高的鲁棒性。
然后我想到这种需求一些机器视觉商业库肯定专门研究过,看了看halcon工程师写的机器视觉算法与应用里shape-based matching的原理,结果发现跟我之前研究过的linemod一模一样。shape-based matching给我最大的启发是只用梯度方向,也就是说不管你用什么花样的算法,当你开始提边缘时你就输了。这是因为边缘和梯度方向虽然都不易被干扰,但一个边缘只有有无边缘1bit的信息量,一旦提多了很难找出想要的形状;而梯度方向信息量会多很多,多提一些再筛选能同时保证召回率(recall)跟准确率(precision),可以说是相当靠谱的。linemod正是这样,简单来说就是选几十个点的梯度方向拿去在图像中进行方向的模板匹配,经过一系列奇巧淫技加速,最终100万像素处理图像耗时60ms,匹配360个模版才7ms。由于只用到了梯度方向,稳定性有保障;再加上速度这么快,各个角度尺度的模版都能直接上了。

基于特征点的匹配详解

目前在计算机视觉领域,匹配定位的算法有很多,如果一一列出的话恐怕我的水平还达不到。所以我只给您推荐一种算法,即OpenCV官方提出的“解决方案”:Features2D + Homography to find a known object。地址:Features2D + Homography to find a known object。该方案先用SURF来提取特征点然后用FLANN进行匹配,过滤出足够好的匹配点之后,用一个矩形来定位出被探测的物体。如下图:
基于形状的模板匹配(用于字符识别)研究
顺便一提,如果如果您已经尝试过SIFT和SURF,那么我想您一定对ORB特征提取算法不陌生。它的性能较前两者更优,还完全免费。论文地址:http://www.willowgarage.com/sites/default/files/orb_final.pdf。所以推荐您用ORB特征提取算法来代替SIFT和SURF,之后再用前文提到的Homography的方法进行定位。正如c++ - Algorithm improvement for Coca-Cola can shape recognition所提到的。

在实际的工程应用中很少采用基于特征点的方法。因为这样做很不稳定,容易错误匹配,而且定位的精度也不高。在商业的视觉软件中,halcon的shape-based match和cognex的patmax算法可以满足你的需要,他们都是轮廓匹配算法,可以抗旋转、缩放和部分遮挡而且精度是亚像素。但是只能定位两个方向的平移和旋转,典型应用是工业中传送带上物体的抓放定位。halcon的轮廓匹配算法是通过边缘的梯度方向和梯度值计算匹配度,根据设定的旋转步长和缩放系数预先建立各个角度和缩放比例下的模板,是一种穷举方法,因此如果写的不好算法是十分耗时的。

GMS了解一下

要求实时(精度也不差): orb+GMS

要求精度: A-SIFT+GMS

相同程度匹配,速度精度比RANSAC效果好