HALCON形状匹配总结Halcon有三种模板匹配方法:即Component-Based、Gray-Value-Based、Shaped_based,分别是基于组件(或成分、元素)的匹配,基于灰度值的匹配和基于形状的匹配,此外还有变形匹配和三维模型匹配也是分属于前面的大类本文只对形状匹配做简要说明和补充:Shape_Based匹配方法:上图介绍的是形状匹配做法的一般流程及模板制作的两种方法。
先要补充点知识:形状匹配常见的有四种情况一般形状匹配模板shape_model、线性变形匹配模板planar_deformable_model、局部可变形模板local_deformable_model、和比例缩放模板Scale_model第一种是不支持投影变形的模板匹配,但是速度是最高的,第二种和第四种是支持投影变形的匹配,第三种则是支持局部变形的匹配。
一般形状匹配模板是最常用的,模板的形状和大小一经制作完毕便不再改变,在查找模板的过程中,只会改变模板的方向和位置等来匹配目标图像中的图像。
这个方法查找速度很快,但是当目标图像中与模板对应的图像存在比例放大缩小或是投影变形如倾斜等,均会影响查找结果。
涉及到的算子通常为create_shape_model 和find_shape_model线性变形匹配模板planar_deformable_model是指模板在行列方向上可以进行适当的缩放。
行列方向上可以分别独立的进行一个适当的缩放变形来匹配。
主要参数有行列方向查找缩放比例、图像金字塔、行列方向匹配分数(指可接受的匹配分数,大于这个值就接受,小于它就舍弃)、设置超找的角度、已经超找结果后得到的位置和匹配分数线性变形匹配又分为两种:带标定的可变形模板匹配和不带标定的可变形模板匹配。
涉及到的算子有:不带标定的模板:创建和查找模板算子create_planar_uncalib_deformable_model和find_planar_uncalib_deformable_model带标定模板的匹配:先读入摄像机内参和外参read_cam_par 和read_pose 创建和查找模板算子create_planar_calib_deformable_model和find_planar_calib_deformable_model局部变形模板是指在一张图上查找模板的时候,可以改变模板的尺寸,来查找图像上具有局部变形的模板。
例如包装纸袋上图案查找。
参数和线性变形额差不多算子如下:create_local_deformable_model和find_local_deformable_model比例缩放末班匹配是介于一般形状匹配和线性变形匹配之间的一种方法。
它可以匹配放大或是缩小的模板,但是仅限于模板大小的缩放,即行列缩放因子一样。
这也是它和线性缩放最大的不同。
涉及到的算子如下:create_scale_shape_model和find_scale_shape_modelHALCON形状匹配LIntExport Herrorcreate_shape_model(const Hobject& Template ,//reduce_domain后的模板图像Hlong NumLevels, //金字塔的层数,可设为“auto”或0—10的整数Double AngleStart, //模板旋转的起始角度Double AngleExtent, //模板旋转角度范围, >=0 Double AngleStep, //旋转角度的步长,>=0 and<=pi/16const char* Optimization, //设置模板优化和模板创建方法const char* Metric, //匹配方法设置Hlong Contrast, //设置对比度Hlong MinContrast , //设置最小对比度Hlong* ModelID ) //输出模板句柄进一步分析:NumLevels越大,找到匹配使用的时间就越小。
另外必须保证最高层的图像具有足够的信息(至少四个点)。
可以通过inspect_shape_model函数查看设置的结果。
如果最高层金字塔的消息太少,算法内部会自动减少金字塔层数,如果最底层金字塔的信息太少,函数就会报错。
如果设为auto,算法会自动计算金字塔的层数,我们可以通过get_shape_model_params函数查看金字塔的层数。
如果金字塔的层数太大,模板不容易识别出来,这是需要将find_shape_model函数中MinScore和Greediness参数设置的低一些。
如果金字塔层数太少找到模板的时间会增加。
可以先使用inspect_shape_model函数的输出结果来选择一个较好的金字塔层数。
参数AngleStart、AngleExtent定义了模板可能发生旋转的范围。
注意模板在find_shape_model函数中只能找到这个范围内的匹配。
参数AngleStep定义了旋转角度范围内的步长。
如果在find_shape_model函数中没有指定亚像素精度,这个参数指定的精度是可以实现find_shape_mode函数中的角度的。
参数AngleStep的选择是基于目标的大小的,如果模板图像太小不能产生许多不同离散角度的图像,因此对于较小的模板图像AngleStep应该设置的比较大。
如果AngleExtent不是AngleStep的整数倍, 将会相应的修改AngleStep 。
如果选择complete pregeneration ,不同角度的模板图像将会产生并保存在内存中。
用来存储模板的内存与旋转角度的数目和模板图像的的点数是成正比的。
因此,如果AngleStep太小或是AngleExtent太大, 将会出现该模型不再适合(虚拟)内存的情况。
在任何情况下,模型是完全适合主存储器的,因为这避免了操作系统的内存分页,使得寻找匹配模板的时间变短。
由于find_shape_model函数中的角度可以使用亚像素精度,一个直径小于200像素的模板可以选择AngleStep >= 1. 如果选择AngleStep=’auto’ (or 0 向后兼容), create_shape_model将会基于模板的大小自动定义一个合适的角度步长. 自动计算出来的AngleStep 可以使用get_shape_model_params函数查看。
如果没有选择complete pregeneration, 该模型会在每一层金字塔上建立在一个参考的位置。
这样在find_shape_model函数运行时,该模型必须转化为不同的角度和尺度在运行时在。
正因为如此,匹配该模型可能需要更多的时间。
对于特别大的模板图像,将参数Optimization设置为不同于’none’的其他数值是非常有用的。
如果Optimization =‘none’, 所有的模型点将要存储。
在其他情况下, 按照Optimization的数值会将模型的点数减少. 如果模型点数变少了,必须在find_shape_model函数中将参数Greediness 设为一个比较小的值, 比如:0.7、0.8。
对于比较小的模型, 减少模型点数并不能提高搜索速度,因为这种情况下通常显着更多的潜在情况的模型必须进行检查。
如果Optimization设置为’auto’,create_shape_model自动确定模型的点数。
Optimization的第二个值定义了模型是否进行预处理(pregenerated completely),是通过选择’pregeneration’或者’no_pregeneration’来设置的。
如果不使用第二个值(例如:仅仅设置了第一个值), 默认的是系统中的设置,是通过set_system(‘pregenerate _shape_models’,…)来设置的,对于默认值是(‘pregenerate_shape_models’ = ‘false’), 模型没有进行预处理. 模型的预处理设置通常会导致比较低的运行时间,因为模型不需要在运行时间时转换。
然而在这种情况下,内存的要求和创建模板所需要的时间是比较高的。
还应该指出,不能指望这两个模式返回完全相同的结果,因为在运行时变换一定会导致变换模型和预处理变换模型之间不同的内部数据。
比如,如果模型没有completelypregenerated,在find_shape_model函数中通常返回一个较低的scores,这可能需要将MinScore设置成一个较低的值。
此外,在两个模型中插值法获得的位置可能略有不同。
如果希望是最高精确度,应该使用最小二乘调整得到模型位置。
参数Contras决定着模型点的对比度。
对比度是用来测量目标与背景之间和目标不同部分之间局部的灰度值差异。
Contrast的选择应该确保模板中的主要特征用于模型中。
Contrast也可以是两个数值,这时模板使用近似edges_image函数中滞后阈值的算法进行分割。
这里第一个数值是比较低的阈值,第二个数值是比较高的阈值。
Contrast也可以包含第三个,这个数值是在基于组件尺寸选择重要模型组件时所设置的阈值,比如,比指定的最小尺寸的点数还少的组件将被抑制。
这个最小尺寸的阈值会在每相邻的金字塔层之间除以2。
如果一个小的模型组件被抑制,但是不使用滞后阈值,然而在Contrast中必须指定三个数值,在这种情况下前两个数值设置成相同的数值。
这个参数的设置可以在inspect_shape_model函数中查看效果。
如果Contrast设置为’auto’,create_shape_model将会自动确定三个上面描述的数值。
或者仅仅自动设置对比度(‘auto_contrast’),滞后阈值(‘auto_contrast_hyst’)或是最小尺寸(‘auto_min_size’)中一个。
其他没有自动设置的数值可以按照上面的格式再进行设置。
可以允许各种组合,例如:如果设置[‘auto_contrast’,’auto_min_size’],对比度和最小尺寸自动确定;如果设置[‘auto_min_size’,20,30],最小尺寸会自动设定,而滞后阈值被设为20和30。
有时候可能对比度阈值自动设置的结果是不满意的,例如,由于一些具体应用的原因当某一个模型组件是被包含或是被抑制时,或是目标包含几种不同的对比度时,手动设置这些参数效果会更好。
因此对比度阈值可以使用determine_shape_model_params函数自动确定,也可以在调用create_shape_model之前使用inspect_shape_mode函数检查效果。