find_shape_mode参数详解及时长优化

    注:本文内容大量引用了王成群所著《Halcon工业使用教程》第二册中9.1.3 find_shape_mode的内容。


       HALCON中最实用的算子find_shape_model,该算子通过模板在图像中寻找没有几何缩放的目标。本文重点对其主要参数进行了归纳整理。通过对该参数的分析,得出通过优化匹配角度、金字塔层数以及贪婪度可减少模板寻找的时长。 

find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score) 

       其输出参数共有4个。分别是目标在图像中的坐标(Row,Column)、目标的旋转角度以及匹配分值。其中,(Row,Column)是目标在图像中的坐标。但是目标是有一定区域的,一个区域的位置怎么会以一个点的坐标来描述呢?实际上是可以的,比如说圆能够以圆心坐标的表示其位置。默认情况下,在find_shape_model中,目标的位置是其重心的位置。这也是其旋转角度默认的旋转中心的位置。而(Row,Column)坐标为了创建变换矩阵,可以用匹配结果实现如仿射变换等对其ROI的功能[1]。 

       匹配得到的目标的分值通过Score返回,是模板在搜索图像中可视比例的近视测量[1]。 

       Image的domain定义了模板参考点的搜索区域,模板参考点是在create_shape_model中用来创建模板图像的domain区域的重心。默认情况下,是在Image的domain区域内搜索模板,且当模板完全属于domain才能有匹配结果。这意味着,如果模板超出图像边界,即使获得的Score>MinScore也不能找到模板。特殊情况下,我们需要,即使部分目标超出了图像区域也能有匹配的结果。因此,需要通过set_system(‘border_shape_models’, ‘true’)改变。这样,那些超出图像边界的目标才有可能被找到[1]。 

       参数AngleStart和AngleExtent确定了模板搜索的旋转角度。该角度尽量是create_shape_model算子中给定的角度一致[1]。 

       参数MinScore设置的越大,搜索的就越快。如果模板在图像中没有被遮挡,MinScore可以设置为0.8,甚至为0.9[1]。 

       NumMatches定义了模板上找到模板的最大个数[1]。如果Image中仅有1个目标,将NumMatches设置为1,将MinScore设置较低,比如0.5。该方式是一种较健壮的在Image中找到匹配目标的参数设置。 

       如果模板具有对称性,则会在搜索图像的同一个位置和不同角度上找到多个与目标匹配的区域。参数MaxOverlap定义了找到两个目标区域的最大重叠度 ,以便于把他们作为两个不同的目标区域分别返回。如果MaxOverlap = 0,找到的目标区域不能存在重叠;如果MaxOverlap = 1,找到所有的目标区域均要返回[1]。 

       SubPixel确定找到的目标是否使用亚像素精度提取。如果其值为‘none’或者‘false’,模板位置仅仅是像素精度和在create_shape_model中定义的角度分辨率。如果其值为 ‘interpolation’或‘true’,位置和角度都是亚像素精度的。在这种模式下模板的位姿是在匹配分数函数中插值运算得到的。这种模式耗费时间较少且精度足够,被广泛使用[1]。 

       但是,在精度要求极高的应用中,模板的位姿应该通过最小二乘法确定,即模板点到相关图像点的距离最小。其值分别有'least_squares', 'least_squares_high', 'least_squares_very_high'。其级别越高,耗时越长。一般情况下,使用’least_squares’能达到时间和精度的平衡[1]。 

       如果目标相对于模板稍微有形变,其匹配的分值会较低。对于这样的目标,可在参数SubPixel额外传递一个最大允许目标变形的参数,‘max_deformation 1’,字符串中的数值是0到32之间的整数值。0代表不允许变形。较高的最大允许变形值导致运行时长的增加且及承担了更高的匹配错误的风险。因此,最大变形应该选择尽可能的小。为了获取一个有意义的分数值以及避免匹配错误,推荐把允许变量和最小二乘法联合使用[1]。 

       NumLevels是在搜索时使用的金字塔级别。当NumLevels=0时,使用创建模板时的金字塔级别。另外,NumLevels还可以包含第二个参数,这个参数定义了找到匹配模板的最低金字塔级别。例如:NumLevels=[4,2]表示在第4层开始匹配,在第2层找到匹配(其默认值为1)。可以使用这种方式降低运行时间,但是这种模式下的位姿参数是精度较低的[1]。 

       如果输入图像质量太差,例如失焦,变形,噪声等,导致边缘信息丢失或变形,通常在最低金字塔层找不到匹配目标。然而,其边缘信息可能在更高的金字塔级别上是足够的[1]。 

       另外,不同图像间,金字塔级别可能略有不同。为了方便对质量较差的图像匹配,在匹配时可以确定最低的金字塔级别。这里的技巧是,最低金字塔层可用负数指明。例如,如果NumLevels为[4,-2],匹配从第4层金字塔开始,跟踪到最低金字塔级别。如果在这层金字塔找不到匹配目标,继续降低金字塔级别进行搜索,把找到至少一个匹配目标的金字塔级别最为最低金字塔级别,并返回找到的目标[1]。 

       参数Greediness确定搜索时的 “贪婪程度”。如果Greediness=0,使用一个安全的启发式搜索,该方式总能找到模板,但耗时较长。一般情况下,将Greediness=0.9,这样几乎所有的情况,总能够找到模板[1]。 

       最后,该模板寻找算子在找不到目标的情况下较为耗时,通过算子 

set_shape_model_param (ModelID, 'timeout', 1000) 

能设置匹配时长,如果find_shape_model达到’timeout’,立刻终止执行,无输出匹配结果,返回一个错误代码9400(H_ERR_TIMEOUT)[1]。 

[1] 王成群. Halcon工业使用教程第二册: 129

--------------------- 

作者:罗泽 

来源:CSDN 

原文:https://blog.csdn.net/u013698770/article/details/52198568 

版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864