31.2、几何定位---不支持缩放(2)
- 查找模板
1、find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel,
NumLevels, Greediness : Row, Column, Angle, Score)
功能:用模板句柄ModelID所指向的模板匹配NumMatches个最合适的对象(目标)。在使用前必须先创建模板。
匹配到的目标的匹配分数通过Score返回。
Image:输入图像
ModelID:输入模板句柄
AngleStart:输入模板旋转的起始角度(单位:弧度)
AngleExtent:输入模板旋转的角度范围(单位:弧度)
MinScore:输入最小匹配分数。默认值为0.5 值范围为(0 ~ 1)
NumMatches:输入匹配数量
MaxOverlap:输入匹配目标(模板实例)的最大重叠度。0.5 值范围为(0 ~ 1)
SubPixel:输入亚像素精度。默认值为'least_squares'
NumLevels:输入匹配使用的金字塔级别。如果NumLevels元素数量等于2,使用金字塔最底层。默认值为0;
Greediness:输入贪婪度(0:安全但慢;1快但可能定位不到)。默认值0.9。值范围为(0 ~ 1)
Row, Column:输出匹配到目标模板的中心坐标,即是模板的原点在搜索图像中坐标。
Angle:输出匹配到的目标的旋转角度
Score:输出匹配到的目标的旋转分数
(1)、AngleStart, AngleExtent
参数AngleStart和 AngleExtent确定了模板搜索的旋转角度,如果有必要,旋转的范围可选取create_shape_model中给定的旋转范围,而一般find_shape_model和create_shape_model中的AngleStart, AngleExtent设置成一样(或者find_shape_model比create_shape_model中的范围小一些)。这意味着创建模板和搜索时的角度范围必须真正的重叠。在搜索时的角度范围不会改变2*pi的。因此在创建模板时,AngleStart = -20°、AngleExtent = 40°,在搜索模板函数find_shape_model中设置AngleStart = 350°、AngleExtent = 20°。尽管角度旋转360°后是重叠的,还是会找不到模板。为了找到模板,在这个例子中必须将AngleStart = 350°改为AngleStart = -10°。如下图,同样的范围,find_shape_model应该选择-10~10,而不是350~370。
此外,请注意,有时匹配目标的角度可能稍微超出指定的旋转角度范围。如果find_shape_model算子指定的角度范围比创建模板时指定的角度范围小时,可能会发生这种情况。
(2)、MinScore
参数MinScore定义模板匹配时至少大于多少匹配分数才算入图像中找到的目标。MinScore设置的越大,搜索的就越快。如果模板在图像中没有被遮挡,MinScore可以设置为0.8这么高甚至可以设置为0.9。如果匹配没有查找到最底层的金字塔,可能是因为:匹配到了一个分数稍微低于MinScore的目标。
(3)、NumMatches
NumMatches定义了在图像上找到模板的最大个数。如果匹配时的匹配分数大于MinScore的目标个数多于NumMatches,仅仅返回最好的NumMatches个目标。如果找到的匹配目标数量不足NumMatches,那么久只返回找到的这几个,级参数MinScore的优先级比NumMatches高。
(4)、MaxOverlap
如果模板具有对称性,会在搜索图像的同一位置和不同角度上找到多个与目标匹配的区域。参数MaxOverlap是0到1之间的,定义了找到的两个目标区域最大重叠度,以便于把它们作为两个不同的目标区域区分返回。如果找到的两个目标区域彼此重叠并且大于MaxOverlap,仅仅返回效果最好的一个。重叠的计算方法是基于找到的目标区域的任意方向的最小外接仿射矩形。如果MaxOverlap = 0,找到的目标区域不能存在重叠。如果MaxOverlap = 1,所有找到的目标区域都要返回。
(5)、SubPixel
确定找到目标是否和使用亚像素精度提取。如果SubPixel设置为'none'(或者设置为'false'(为了向后兼容)),模板的位置仅仅是像素精度和在create_shape_model中定义的角度分辨率。
如果SubPixel设置为'interpolation'(或'true'),位置和角度都是亚像素精度的。在这种模式下模板的位姿是在匹配分数函数中通过插值运算得到的,这种模式几乎不花费计算时间,并且能到到足够高的精度,被广泛应用。
然而在一些精度要求极高的应用中,模板的位姿应该通过最小二乘法确定,即模板点到相关图像点的距离最小。与'interpolation'相比,这种模式需要额外的计算时间,对于最小二乘法的模式有'least_squares'、 'least_squares_high'、'least_squares_very_high'。它们可用来定义被搜索的最小距离精度,选择的精度越高,亚像素企图时间越长。然而,通常SubPixel设置为'interpolation',如果希望使用最小二乘法'least_squares',因为这样能确保运行时间和精度的权衡。
①、是在搜索时使用的金字塔级别,如果有必要,可以选取创建模板时给定的范围。如果NumLevels = 0,使用
创建模板时的金字塔级别。另外NumLevels还可以包含第二个参数,这个参数定义了找到匹配模板的最低金字塔级别。。NumLevels = [4,2]表示匹配在第四层金字塔开始,在第二层金字塔找到匹配(最低假设为1)。可以使用这种方法降低匹配运行时间。当这种模式下位姿精度是比正常模式要低的,所谓正常模式是金字塔最低层匹配。因此如果需要较高精度,应该设置SubPixel至少为'least_squares' 。如果金字塔最底层设置过大,可能不会达到期望的精度,或者找到一个不正确的匹配区域。这时因为在较高金字塔上模板是不足够(边缘点数太少),不足以找到可靠的模板最佳匹配目标。在这种情况下最底层禁止特级别应该设置为较小值。
②、输入图像质量太差,例如失焦,变形,噪声等,导致边缘信息丢失或变形,通常在最底层金字塔找不到匹配
目标。然而信息可能在更高的金字塔级别上是足够的。如果使用较高金字塔级别匹配目标,请牢记上述的精度和鲁棒性规则。
③、选择合适的金字塔级别,即在最低金字塔级别上至少能找到一个匹配目标,取决于模板和输入图像。不同图
表示在搜索时的贪婪度。如果Greediness = 0 ,使用一个安全的模式搜索,模板在图像中存在,总能找到,然而这种方式下搜索相当浪费时间的。如果Greediness = 1,使用不安全的模式搜索,这样即使模板存在于图像中,也可能找不到模板,当只是少数情况。如果设置Greediness = 0.9,几乎所有情况下,总能找到模板。
模板匹配目标的位置和旋转角度通过参数: Row, Column, Angle返回。Row, Column是模板的原点在搜索图像中坐标。Row, Column的坐标,这些参数数值是为了创建仿射变换矩阵的,可以使用匹配结果完成各种任务,如对比ROI
(9)、Score
Score是一个从0到1的数,是模板在搜索图像中可视比例的近似测量。如果模板的一半被遮挡,该值就不能超过
0.5。
2、find_shape_models(Image : : ModelIDs, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel,
NumLevels, Greediness : Row, Column, Angle, Score, Model)
功能:使用多模板在一幅图像寻找匹配目标
Image:输入图像
ModelID:输入模板句柄元组
AngleStart:输入模板旋转的起始角度(单位:弧度)
AngleExtent:输入模板旋转的角度范围(单位:弧度)
MinScore:输入最小匹配分数。默认值为0.5 值范围为(0 ~ 1)
NumMatches:输入匹配数量
MaxOverlap:输入匹配目标(模板实例)的最大重叠度。0.5 值范围为(0 ~ 1)
SubPixel:输入亚像素精度。默认值为'least_squares'
NumLevels:输入匹配使用的金字塔级别。如果NumLevels元素数量等于2,使用金字塔最底层。默认值为0;
Greediness:输入贪婪度(0:安全但慢;1快但可能定位不到)。默认值0.9。值范围为(0 ~ 1)
Row, Column:输出匹配到目标模板的中心坐标,即是模板的原点在搜索图像中坐标。
Angle:输出匹配到的目标的旋转角度
Score:输出匹配到的目标的旋转分数
Model:匹配到的目标对应模板句柄在句柄元组中的索引
该算在详细参数描述看find_shape_model
3、出边界计算方式
Image的domain定义了模板参考点的搜索区域,模板参考点是在create_shape_model中用来创建模板图像的domain区域的中心。不考了使用函数set_shape_model_origin设置不同的初始位置。在图像domain区域的这些点内搜索模板,其中模板完全属于这幅图像。则意味值如果模板超出图像边界,即使获得的匹配系数(score)大于MinScore也不能找到模板。这种行为可以通过set_system('border_shape_models', 'true' )
改变,这样那些超出图形边界,匹配系数大于MinScore的模板也能被找到。这时那些图像外面的点看做是被遮挡跑了,可以降低匹配系数。在这种模式下搜索时间将会增加。
4、设置超时
使用算子set_shape_model_param,可以设置算子find_shape_model的超时时间timeout。如果算子set_shape_model_param超过timeout,则立刻终止执行,无输出结果,返回一个错误代码9400 (H_ERR_TIMEOUT).
- 释放模板资源
1、clear_shape_model( : : ModelID: )
功能:释放形状模板的内存
ModelID:输入模板句柄
描述:有效模板句柄为非负数,释放模板资源后,模板无效,当模板句柄保持原值,建议释放后把模板句柄赋值为负值,使其无效。
2、clear_all_shape_models( : : : )
功能:释放所有形状模板的内存
注:clear_all_shape_models( : : : )的存在仅仅为了在HDevelop实现"复位程序"("reset program")的目的。clear_all_shape_models( : : : )不得用于任何应用程序。
- 参数关系优化匹配
1、这里主要说明一下一些参数的作用,强调一下它们影响匹配速度的程度;在为了提高速度而设置参数之前,有必要
找出那些在所有测试图像中匹配成功的设置,这时需要考虑以下情况:
(1)、必须保证二踢在图像边缘处截断,也就是保证轮廓的清晰,这些可以通过形态学的一些方法来处理。(图像增强、锐化等技术)
(2)、如果Greediness值设置的太高,就找不到启用一些可见物体,这时最后将其设置为0来执行完全搜索。
(3)、物体是否有遮挡区域,如果要求物体在任何情况下都能被识别,应该减少MinScore值;
(4)、判断在金字塔最高级上的匹配是否失败,可通过find_shape_model减少NumLevels值来测试。
(5)、物体是否具有较低的对比度,如果要求物体在任何状态下都能被识别,应该减少MinContrast值
(6)、判断是否全局地或局部地转换对比度极性,如果需要在任何状态向都能被识别,则应给参数Metric设置一个合适的值
(7)、物体是否与物体重叠的其他实例重叠,如果需要在任何状态下都能识别物体,则应MaxOverlap值
(8)、判断是否在相同物体上找到多个匹配值,如果物体几乎是对称的,则需要控制旋转范围。
2、如何加快所偶匹配,需要在这些参数中进行合理的搭配,有一下方法可以参考。
(1)、只要匹配成功,则尽可能增加MinScore的值
(2)、增加Greediness值知道匹配失效,同时在需要时减少MinScore的值;
(3)、如果可能,在创建模板时使用一个大的NumLevels,即将图像多分为几个金字塔级别。
(4)、限定允许的旋转范围和大小范围,在调用find_shape_model时调整相应的参数;
(5)、尽量限定搜索ROI区域。
当然这些方法都需要更实际联系起来,不同图像在匹配过程中也会有不同的匹配效果,在具体到某些应用,不同的硬件设施也会对这个匹配算法提出新的要求,所以需要不断去尝试。