halcon模板匹配

在机器视觉应用中,经常需要对图像进行仿射变换。
1、在基于参考的视觉检测中,由于待检图像与参考图像或多或少都会存在几何变化(平移、旋转、缩放等),所以在做比较之前一般都要对待检图像进行仿射变换以对齐图像。
2、要进行仿射变换,必须先获取变换矩阵,形状匹配是获取变换矩阵的一种高效的方法。
3、Halcon的如下几个函数是专门用于计算变换矩阵的:
vector_angle_to_rigid :Compute a rigid affine transformation from points and angles.  
vector_to_rigid :Approximate a rigid affine transformation from point correspondences. 
vector_to_similarity :Approximate an similarity transformation from point correspondences. 
vector_to_hom_mat2d :Approximate an affine transformation from point correspondences. 
4、Halcon中用于形状匹配的函数有:
find_shape_model :Find the best matches of a shape model in an image. 
find_shape_models :Find the best matches of multiple shape models. 
find_scaled_shape_model :Find the best matches of a scale invariant shape model in an image. 
find_scaled_shape_models :Find the best matches of multiple scale invariant shape models. 
5、单匹配计算刚性变换矩阵:vector_angle_to_rigid只需要一个点对及一个角度对即可计算刚性变换矩阵,所以可直接利用find_shape_model的结果,但精度可能稍低。
6、双匹配计算刚性变换矩阵:vector_to_rigid需要至少两个点对的支持,所以需要用两次find_shape_model或用一次find_shape_models,精度会比单匹配高,但仍局限于刚性变换。
7、双匹配计算相似变换矩阵:vector_to_similarity用于计算相似变换矩阵,需要至少两个点对的支持,所以需要用两次find_scaled_shape_model或用一次find_scaled_shape_models。
8、三匹配计算一般变换矩阵:vector_to_hom_mat2d用于计算一般的其次变换矩阵,需要至少三个点对的支持,所以需要用三次find_scaled_shape_model或用一次find_scaled_shape_models。
9、综上,在不同情况下,选用相应的变换矩阵类型、形状匹配方法,可以达到事半功倍的效果!

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

create_shape_model_xld

find_shape_model
它也拥有许多的参数,这些参数都影响着寻找模板的速度和精度。这个的功能就是在一幅图中找出最佳匹配的模板,返回一个模板实例的长、宽和旋转角度。其中参数SubPixel决定是否精确到亚像素级,设为’interpolation’,则会精确到,这个模式不会占用太多时间,若需要更精确,则可设为’least_square’,’lease_square_high’,但这样会增加额外的时间,因此,这需要在时间和精度上作个折中,需要和实际联系起来。比较重要的两个参数是MinSocre和Greediness,前一个用来分析模板的旋转对称和它们之间的相似度,值越大,则越相似,后一个是搜索贪婪度,这个值在很大程度上影响着搜索速度,若为0,则为启发式搜索,很耗时,若为1,则为不安全搜索,但最快。在大多数情况下,在能够匹配的情况下,尽可能的增大其值。

vector_angle_to_rigid
affine_trans_contour_xld
找到之后,还需要对其进行转化,使之能够显示,这两个函数vector_angle_to_rigid()和affine_trans_contour_xld()在这里就起这个作用。前一个是从一个点和角度计算一个刚体仿射变换,这个函数从匹配函数的结果中对构造一个刚体仿射变换很有用,把参考图像变为当前图像

基于形状匹配的参数关系与优化
                       
    在HALCON的说明资料里讲到了这些参数的作用以及关系,在上面提到的文章中也作了介绍,这里主要是重复说明一下这些参数的作用,再强调一下它们影响匹配速度的程度;
    在为了提高速度而设置参数之前,有必要找出那些在所有测试图像中匹配成功的设置,这时需考虑以下情况:
    ① 必须保证物体在图像边缘处截断,也就是保证轮廓的清晰,这些可以通过形态学的一些方法来处理;
    ② 如果Greediness值设的太高,就找不到其中一些可见物体,这时最后将其设为0来执行完全搜索;
    ③ 物体是否有封闭区域,如果要求物体在任何状态下都能被识别,则应减小MinScore值;
    ④ 判断在金字塔最高级上的匹配是否失败,可以通过find_shape_model()减小NumLevels值来测试;
    ⑤ 物体是否具有较低的对比度,如果要求物体在任何状态下都能被识别,则应减小MinContrast值;
    ⑥ 判断是否全局地或者局部地转化对比度极性,如果需要在任何状态下都能被识别,则应给参数Metric设置一个合适的值;
    ⑦ 物体是否与物体的其他实例重叠,如果需要在任何状态下都能识别物体,则应增加MaxOverlap值;
    ⑧ 判断是否在相同物体上找到多个匹配值,如果物体几乎是对称的,则需要控制旋转范围;
如何加快搜索匹配,需要在这些参数中进行合理的搭配,有以下方法可以参考:
    ①  只要匹配成功,则尽可能增加参数MinScore的值;
    ②  增加Greediness值直到匹配失败,同时在需要时减小MinScore值;
    ③  如果有可能,在创建模板时使用一个大的NumLevels,即将图像多分几个金字塔级;
    ④  限定允许的旋转范围和大小范围,在调用find_shape_model()时调整相应的参数;
    ⑤  尽量限定搜索ROI的区域;
     除上面介绍的以外,在保证能够匹配的情况下,尽可能的增大Greediness的值,因为在后面的实验中,用模板匹配进行视频对象跟踪的过程中,这个值在很大程度上影响到匹配的速度。
    当然这些方法都需要跟实际联系起来,不同图像在匹配过程中也会有不同的匹配效果,在具体到某些应用,不同的硬件设施也会对这个匹配算法提出新的要求,所以需要不断地去尝试。

posted on 2018-03-08 15:41  NLazyo  阅读(5974)  评论(0编辑  收藏  举报