一前言

      后面的讲解会结合实际项目代码,主要界面如下(分为三个界面,第一个是基于X和Y方向没有形变的匹配,第二个是基于X和Y方向形变量相同        的匹配,第三个是基于X和Y方向上形变量不同的模板匹配,后期会有一整套关于Halcon联合C#编程的文章,代码会一起上传,主要是关于Halcon 联合c#各个品牌相机的操作,模板匹配,尺寸检测和脏污检测,以及如何保存NG图片,切换不同的程序等)

opencv halcon 模板匹配耗时对比_灰度值

二,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)     //输出匹配位置的行和列坐标、角度、得分,行列坐标和角度用作放射变换使用。