一前言
后面的讲解会结合实际项目代码,主要界面如下(分为三个界面,第一个是基于X和Y方向没有形变的匹配,第二个是基于X和Y方向形变量相同 的匹配,第三个是基于X和Y方向上形变量不同的模板匹配,后期会有一整套关于Halcon联合C#编程的文章,代码会一起上传,主要是关于Halcon 联合c#各个品牌相机的操作,模板匹配,尺寸检测和脏污检测,以及如何保存NG图片,切换不同的程序等)
二,Halcon 模板匹配分类(主要罗列了常用的两类模板匹配)
1.基于灰度值的模板匹配: 主要应用于对象内部的灰度值没有很大的变化,没有缺失部分,没有干扰和噪声的场合;
2.基于形状的模板匹配:A.不存在形变的模板匹配:匹配的对象没有形变。
B.基于形变的模板匹配:匹配的对象有一定形变。
1). X和Y方向等比例发生形变
2).X和Y方向不等比例发生的形变
C.基于组件的模板匹配:形状模板匹配的扩展,不支持大小缩放,一般用于多个对象或工件定位的场合。
三.X和Y方向不存在形变的模板匹配(算子定义解释)
1.创建模板
create_shape_model(Template : : //reduce_domain获取的图像
NumLevels, //金字塔的层数,可设为“auto”或0—10的整数,一般设为AUTO即可
AngleStart, //模板旋转的起始角度
AngleExtent, //模板旋转角度范围,>=0
AngleStep, //旋转角度的步长,>=0 and <=pi/16,建议初学直接设为auto
Optimization, //设置模板优化和模板创建方法,一般情况下直接设为auto即可,
Metric, //匹配方法设置 根据需要设置为'use_polarity'或'ignore_global_polarity'
Contrast, //设置对比度
MinContrast : //设置最小对比度,一般设为auto
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函数中的这两个参数匹配,在角度在这个范围内,才能被找到
3).参数AngleStep定义了旋转角度范围内的步长,AngleStep的选择是基于目标的大小的,如果模板图像太小不能产生许多不同离散角度的图像,因此对于较小的模板图像AngleStep应该设置的比较大。
4).Optimization,参数,一般情况下设为auto即可,主要是在模板较大的时候,需要设置为'point_reduction_low', 'point_reduction_medium', 'pregeneration'等来减少模板的像素个数,对于初学者不需要深刻理解,设置为auto,程序会自动判断是否减少点数,来增加模板的可应用性。
5).Metric主要是设置模板的极性,决定在什么样的条件下模板可以被识别出来,譬如有时候,创建模板的时候,模板是纯黑色的,即灰度值是接近于0的,但寻找模板的时候希望纯白的也能找到,即灰度值是接近255的类似模板,
'use_polarity' 选择此项后,创建的模板和后期需要被匹配的图片需要具有相同的对比度。
'ignore_local_polarity' 选择此项后,即使被匹配的图片局部对比度发生变化,模板也是可以找到的
'ignore_global_polarity' 选择此项后,即使被匹配的图片所有的对比度发生变化,模板也可以被找到
'ignore_color_polarity' 选择此项后,即使被匹配图片颜色有所改变,模板也可以被找到
6).Contrast 参数决定了在制作模板的时候,模板相对于背景的对比度
7).MinContrast 参数决定了在模板匹配的过程中,被匹配的模板最小应该具有的对比度,该参数是将模板与图像中的噪声分离开来,使得更容易匹配到模板,因此,此参数的设定必须小于Contrast,在一幅图片中,如果被识别的部分和背景之间具有非常小的对比度,相应的MinContrast应该设置的非常小,正常使用一般最好设为auto,在制作模板的时候,程序根据灰度值自动设定。
2,匹配模板
find_shape_model(Image : : //搜索图像,原始图像,需要找模板的图像
ModelID, //模板句柄,制作模板时输出的句柄
AngleStart, // 搜索时的起始角度,和创建模板时的角度设为一致
AngleExtent, //搜索时的角度范围,最好和创建模板时的范围一致
MinScore, //最小匹配值,输出的匹配的得分Score,就是找到的模板和创建的模板的相似度,值越高越不容易找到,越小越容易找到,也容易找错
NumMatches, //定义要输出的匹配的最大个数,一张图片可以被找到很多个模板,此参数定义需要找到的个数
MaxOverlap, //当找到的目标存在重叠时,且重叠大于该值时选择一个好的输出,根据需要选择
SubPixel, //匹配模板的精度,精度设置越高,耗时也越长,选择合适的很重要,一般选择 'least_squares'
NumLevels, //搜索时金字塔的层数,一般设为0,使用创建模板时设定的值
Greediness : //贪婪度,决定匹配模板的搜索速度,值越高,搜索越快,也越容易找不到,一般0.7到0.8最为合适
Row, Column, Angle, Score) //输出匹配位置的行和列坐标、角度、得分,行列坐标和角度用作放射变换使用。