halcon模板匹配* 在一个图片中获取ROI并在此图片中匹配dev_close_window ()dev_open_window (0, 0, 600, 600, 'black', WindowHandle)* 窗口语句read_image(Image,'L:/Halcon test/mk2.jpg')*read_image(Image,'L:/Halcon test/mk3.jpg')*read_image(Image,'L:/Halcon test/mk4.jpg')* 这里有4张图片,每一张都说明一个小问题,附图分析。
gen_rectangle1 (ROI1, 57.8333, 49.5, 181.167, 342.833)* 画一个矩形选择ROI,矩形在左上角,覆盖一个完整的,无变形规定尺寸的商标,作为模板。
reduce_domain(Image,ROI1,ImageReduced1)* 大图和这个矩形的ROI相减就会得到一个左上角的商标的图案作为模板,命名ImageReduced。
create_shape_model(ImageReduced1,0,0,rad(360),0,'no_pregeneration','use_polarity',40,10,ModelID1)* 创建一个比例不变(1:1)的匹配的轮廓模型。
具体参数下个帖子说明,也可见[Halcon算子学习交流区] Halcon模版匹配算子解析。
find_shape_model(Image,ModelID1,0,rad(360),0.7,13,0.5,'interpolation',0,0.9,Row,Column,Angle,Score)* 寻找与模板的大小尺寸必须是一比一匹配的,只是角度的不同而已,若大小发生变化,则不能匹配get_shape_model_contours(ModelContours1,ModelID1,1)* 在大图中获取匹配。
for i := 0 to |Row|-1 by 1vector_angle_to_rigid(0,0,0,Row【i】,Column【i】,Angle【i】,HomMat2D)affine_trans_contour_xld(ModelContours2,ContoursAffinTrans,HomMat2D)endfor* 获取匹配。
disp_message (WindowHandle, '总共匹配了' + |Row| + '个商标', 'window', 12, 12, 'red', 'true')* 输出数量统计。
clear_shape_model(ModelID1)stop()[cpp]view plain copy1.create_shape_model(2.Template : : //reduce_domain后的模板图像3.NumLevels,//金字塔的层数,可设为“auto”或0—10的整数4.AngleStart,//模板旋转的起始角度5.AngleExtent,//模板旋转角度范围, >=06.AngleStep,//旋转角度的步长, >=0 and <=pi/167.Optimization,//设置模板优化和模板创建方法8.Metric, //匹配方法设置9.Contrast,//设置对比度10.MinContrast ://设置最小对比度11.ModelID ) //输出模板句柄1. NumLevels越大,找到匹配使用的时间就越小。
另外必须保证最高层的图像具有足够的信息(至少四个点)。
可以通过inspect_shape_model函数查看设置的结果。
如果最高层金字塔的消息太少,算法内部会自动减少金字塔层数,如果最底层金字塔的信息太少,函数就会报错。
如果设为auto,算法会自动计算金字塔的层数,我们可以通过get_shape_model_params函数查看金字塔的层数。
如果金字塔的层数太大,模板不容易识别出来,这是需要将find_shape_model函数中MinScore和Greediness参数设置的低一些。
如果金字塔层数太少找到模板的时间会增加。
可以先使用inspect_shape_model函数的输出结果来选择一个较好的金字塔层数。
2. 参数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 函数运行时,该模型必须转化为不同的角度和尺度在运行时在。
正因为如此,匹配该模型可能需要更多的时间。
3. 对于特别大的模板图像,将参数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'), 模型没有进行预处理. 模型的预处理设置通常会导致比较低的运行时间,因为模型不需要在运行时间时转换。
然而在这种情况下,内存的要求和创建模板所需要的时间是比较高的。
还应该指出,不能指望这两个模式返回完全相同的结果,因为在运行时变换一定会导致变换模型和预处理变换模型之间不同的内部数据。
比如,如果模型没有completely pregenerated,在find_shape_model函数中通常返回一个较低的scores,这可能需要将MinScore设置成一个较低的值。
此外,在两个模型中插值法获得的位置可能略有不同。
如果希望是最高精确度,应该使用最小二乘调整得到模型位置。
4. 参数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函数检查效果。