您的位置:首页 > 其它

基于形状的模板匹配

2015-03-25 21:06 260 查看
前段时间一直在做图像模板匹配。需要对旋转模板进行匹配,并且对速度精度都有较高的要求。OpenCV里面并没有较好的解决方法。

cvMatchTemplate( const CvArr* image, constCvArr* templ,CvArr* result,int method )
Image  待搜索图像
Templ  模板图像
Result  匹配结果  用来存放通过以下方法计算出滑动窗口与模板的相似值
Method  计算匹配程度的方法
以上函数当模板存在较大旋转时就无法准确匹配了。
OpenCV形状匹配函数 

double cvMatchShapes(void* object1,void* object2,int method)
第一个参数是待匹配的物体1,
第二个是待匹配的物体2,
第三个参数method可以有CV_CONTOURS_MATCH_I1,CV_CONTOURS_MATCH_I2,CV_CONTOURS_MATCH_I3三种输入,这其实就是三种不同的判定物体相似的方法,匹配的返回值也是不一样的。


以上函数匹配精度也不高,只能达到像素级。
特征点匹配如Sift算法等需要图像质量较好,噪声大的图像不适应,而且找到特征点之间一一对应关系是难点。

halcon等商业软件这方面做的很好。halcon基于形状的匹配Shape-Based matching能完美解决工业条件下的模板匹配问题。

HALCON提供的基于形状匹配的算法主要是针对感兴趣的小区域来建立模板,对整个图像建立模板也可以,但这样除非是对象在整个图像中所占比例很大,比如像视频会议中人 体上半身这样的图像,我在后面的视频对象跟踪实验中就是针对整个图像的,这往往也是要牺牲匹配速度的。基本流程是这样的:

⑴ 首先确定出ROI的矩形区域,这里只需要确定矩形的左上点和右下点的坐标即可,gen_rectangle1()这个函数就会帮助你生成一个矩形,利用area_center()找到这个矩形的中心;

⑵ 然后需要从图像中获取这个矩形区域的图像,reduce_domain()会得到这个ROI;这之后就可以对这个矩形建立模板,而在建立模板之前,可以先对这个区域进行一些处理,方便以后的建模,比如阈值分割,数学形态学的一些处理等等;

⑶ 接下来就可以利用create_shape_model()来创建模板了,这个函数有许多参数,其中金字塔的级数由Numlevels指定,值越大则找到物体的时间越少,AngleStart和AngleExtent决定可能的旋转范围,AngleStep指定角度范围搜索的步长;这里需要提醒的是,在任何情况下,模板应适合主内存,搜索时间会缩短。对特别大的模板,用Optimization来减少模板点的数量是很有用的;MinConstrast将模板从图像的噪声中分离出来,如果灰度值的波动范围是10,则MinConstrast应当设为10;Metric参数决定模板识别的条件,如果设为’use_polarity’,则图像中的物体和模板必须有相同的对比度;创建好模板后,这时还需要监视模板,用inspect_shape_model()来完成,它检查参数的适用性,还能帮助找到合适的参数;另外,还需要获得这个模板的轮廓,用于后面的匹配,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()在这里就起这个作用。前一个是从一个点和角度计算一个刚体仿射变换,这个函数从匹配函数的结果中对构造一个刚体仿射变换很有用,把参考图像变为当前图像。





目前调用Halcon函数确实可以解决问题,但最终还是要自主开发,目前的方案是先粗定位再精定位,精度要到亚像素级别,并且能输出角度。

注:转载请注明出处!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息