对于工业应用来说,往往需要用到形状匹配来达到定位功能,VisionPro的PatMax算法,Halcon的形状匹配算法都是基于边缘的模版匹配。halcon中的形状匹配具有良好的鲁棒性,稳定,准确,快速的特点。opencv中虽然也有形状匹配算法,但是,是基于七阶不变矩来计算轮廓相似度,具有旋转缩放不变性。因此,无法求出目标形状的旋转和缩放系数。并且对于形状变换不大的轮廓也很难区分开,比如圆形和正方形。
下面说下实现带旋转和缩放的形状匹配算法的主要流程
1.获取模版
(1).对模板图像进行一系列旋转,缩放,以及金字塔下采样,生成一系列不同旋转角度,缩放系数,以及金字塔层数的模板。
(2).提取模板的边缘。依据Canny算法的原理,提取边缘点。
(3).计算边缘点在的x,y方向的梯度值以及总的梯度值。
(4).保存边缘点对应的x,y梯度,并将梯度强度归一化处理以消除光照不均的影响(1除以该点梯度强度,这样得到的值都是[0,1]区间内的值)并将边缘点坐标转换为相对于重心的相对坐标
经过以上操作,我们便建立好了一系列旋转,缩放,以及不同金字塔层模版。
2,模版匹配
(1).计算搜索图像边缘点梯度信息。同获取模板 (2)(3)。
(2).金字塔下采样,得到多级金字塔图像的边缘点梯度信息,再分别进行(1)。
(3).这步是最重要的,通过 归一化交叉相关(NCC) 算法计算模板边缘梯度和目标图像边缘梯度向量的相关性。
而且该算法得到的值就是匹配相关性的得分,分值范围在[0,1],具体实现可以去看代码。其实就是使用事先生成的一些列模板让重心在搜索图像中平移,每移动一步计算一下边缘点对应的梯度向量相关性。找到评分最高的点就是匹配到形状的重心。所用模板的旋转和缩放系数,就对应搜索图像中目标的旋转和缩放。其中金字塔用来对算法进行加速。先在顶层金字塔进行快速搜索匹配得到一个匹配位置,然后在下一层金字塔进行匹配的时候就能在该区域的roi内进行搜索,以此类推,直到最底层。通过金字塔可以大大加快匹配速度。在搜索匹配过程中还采用了一种停止条件用来提高速度,如果计算边缘点梯度相似性过程中得分过低,就可以跳过后续边缘点的计算,直接移动到下一个位置。
本文转自:https://blog.csdn.net/the_future_way/article/details/110448796