本帖最后由 王绍昶 于 2016-4-2 22:09 编辑
模板匹配是在一幅图像中寻找与另一幅模板图像最匹配部分的技术,通俗一点讲,就是我们已经将一个标准的没有瑕疵的轮廓存储了下来,我们再通过抓取图像,轮廓提取或者特征提取把得到的轮廓与目标轮廓提取,以进行检测或者识别目标物。目前机器视觉领域使用较广泛的比较成熟的商用软件是Halcon,其中提供的匹配的方法主要有:Component-Based、Gray-Value-Based、Shape-Based、Correlation-Based,分别是基于组件(或成分、元素)的匹配、基于灰度值的匹配、基于形状的匹配和基于相关性匹配。这几种匹配的方法各具特点,分别适用于不同的图像特征,但都有创建模板和寻找模板的相同过程。 1.基于形状的模板匹配 HALCON提供的基于形状匹配的算法主要是针对感兴趣的小区域来建立模板,对整个图像建立模板也可以,但往往会牺牲匹配速度。基本流程如下: ⑴ 首先确定出ROI的矩形区域,这里只需要确定矩形的左上点和右下点的坐标即可,利用gen_rectangle1()函数生成一个矩形,利用area_center()找到这个矩形的中心。 ⑵ 然后需要从图像中获取这个矩形区域的图像,reduce_domain()会得到这个ROI;这之后就可以对这个矩形建立模板,而在建立模板之前,可以先对这个区域进行一些处理,方便以后的建模,比如阈值分割,数学形态学的一些处理等等; ⑶ 接下来利用create_shape_model()函数来创建模板,此函数有许多参数,其中金字塔的级数(因为我们拍到的图像会有一定比例的缩放,所以我们要把模板设置级数,以便我们进行匹配)由Numlevels指定,值越大则找到物体的时间越少,AngleStart和AngleExtent决定可能的旋转范围,AngleStep指定角度范围搜索的步长;在任何情况下,模板应适合主内存,搜索时间会缩短。用get_shape_model_contours()函数获得该模板的轮廓,用于后面的匹配; ⑷ 建好模板后,打开需要匹配的图像进行模板匹配。这个过程就是在新图像中寻找与模板最匹配(相似)的部分,这部分由函数find_shape_model()完成,它有许多参数,这些参数都影响着寻找模板的速度和精度。该函数的功能就是在一幅图中找出最佳匹配的模板,返回一个模板实例的长、宽和旋转角度。其中参数SubPixel设为‘interpolation’则会精确到亚像素级,这个模式不会占用太多时间,若需要更精确,则可设为‘least_square’,‘lease_square_high’,但会增加额外的匹配时间,具体应根据实际应用。比较重要的两个参数是MinSocre和Greediness,前一个用来分析模板的旋转对称和它们之间的相似度,值越大,则越相似,后一个是搜索贪婪度,这个值在很大程度上影响着搜索速度,若为0,则为启发式搜索耗时很长,若为1,则为不安全搜索但速度最快。在大多数情况下,在能够匹配的情况下,尽可能的增大其值。 ⑸ 最后找到匹配之后,需要对其进行转化并显示,使用函数vector_angle_to_rigid()和affine_trans_contour_xld()。前者是从一个点和角度计算一个刚体仿射变换,这个函数从匹配函数的结果中对构造一个刚体仿射变换很有用,把参考图像变为当前图像。 模板匹配再实际中有很多应用,比如我们进行产品的检测,就是要和模板进行比对,进而判断是不是合格。还有在人工智能领域,当机器人是如何识别到目标的呢?其实和这是一样的,也是要和存在自己“大脑”中的模板进行对比。希望对大家有帮助:)
|