zoukankan      html  css  js  c++  java
  • 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的值,因为在后面的实验中,用模板匹配进行视频对象跟踪的过程中,这个值在很大程度上影响到匹配的速度。
        当然这些方法都需要跟实际联系起来,不同图像在匹配过程中也会有不同的匹配效果,在具体到某些应用,不同的硬件设施也会对这个匹配算法提出新的要求,所以需要不断地去尝试。

  • 相关阅读:
    stenciljs 学习四 组件装饰器
    stenciljs 学习三 组件生命周期
    stenciljs 学习二 pwa 简单应用开发
    stenciljs ionic 团队开发的方便web 组件框架
    stenciljs 学习一 web 组件开发
    使用npm init快速创建web 应用
    adnanh webhook 框架 hook rule
    adnanh webhook 框架 hook 定义
    adnanh webhook 框架request values 说明
    adnanh webhook 框架execute-command 以及参数传递处理
  • 原文地址:https://www.cnblogs.com/bile/p/8528843.html
Copyright © 2011-2022 走看看