说说Halcon的形状匹配和灰度匹配
本人用Halcon差不多有10年了,从当时的Halcon8用到现在的Halcon20,大大小小的很多的工业视觉应用场景都经历过,主要有两类:
第一类:运动控制类设备,如激光焊接和雕刻,丝印机,贴片机,数控机床等自动化设备,视觉就是模板匹配,先做好Mark点,然后在生产中快速进行形状或者灰度模板匹配,定位产品的位置,最后进行焊接或者贴合的工艺动作。这种设备量产最多,市场同行之间竞争很激烈,基本上是标准机,对模板匹配的速度和精度都有很高的要求,一台机器里往往有几个相机和十几个轴,对成本控制的非常严格。
第二类:AOI检测设备,如检孔机、PCB和手机玻璃外观检测,目前很多是非标机,根据客户要求来订制光源镜头相机,视觉功力要深厚些,基本上是先定位,再检测。定位用到的很多是形状或者灰度匹配。
说到这里,回到本文的主题,到底形状和灰度有什么差别或者优缺点呢?Halcon的算子的参数怎么设定呢?可以分别应用在什么场合呢?市场上商用的其他工业软件库品牌收费和特点怎样呢?
推荐看看中国的Malcon跟德国的Halcon的相比的优缺点
https://blog.csdn.net/lindrs/article/details/114113280
模板匹配特点:
形状匹配,find_shape_model,顾名思义,就是用产品的形状来做匹配,或者说是产品边缘来做匹配,Halcon的形状匹配可以做到即使存在严重遮挡、混乱或非线性光照变化,也能实现极高的识别率;
灰度匹配,find_ncc_model,就是框什么就识别什么,不仅识别产品的边缘,也识别产品本身的内部的信息,即使存在线性均匀的光照变化,也能识别,非线性的光照变化的话,识别不了,出来的分数很低,有个相似度的公式,比较复杂,这里就不做说明,感兴趣可以网上搜索下,很多资料。
优缺点和应用场合分析:
形状匹配:Halcon的识别算法有个公式,在其帮助文档里,大概原理是在做产品模板时候提取每个边缘点的XY方向信息和梯度值,然后在生产时,先计算搜索图的每一个点的XY方向信息和梯度值,在每一个点的位置上,循环跟模板每一个边缘点进行汇总比较,得分值在0-1之间。显而易见,如果边缘点个数比较多的话,就用时较多;因为比较的是模板边缘点,即使产品本身被遮挡了,只有其边缘还能提取出来部分大于你设定的分数阈值,产品还是能识别出来的,主要应用场合是在有多个产品的识别要求,放在流水线上或者传送带上,用机械手抓取的。
NCC灰度匹配的公式很多年前就已经提出来了,很成熟,市场上很多商用软件包括Halcon,都包含有对应的模块,并且相对于形状匹配来说价格一套可以便宜几千块,识别速度很快,精度也能达到亚像素,上边说的第一类设备基本上都是用灰度匹配,因为其用的LED光源光照均匀,即使作业员调暗或者调亮光源或者改变相机的曝光时间,都能准确识别出来。在做产品时,往往只有一个产品,不需要识别遮挡、混乱的情况,并且有时若是有遮挡,相当于产品粘合在一起,必须报警,所以从根本上就不能用形状匹配的。
两者参数设定:
create_shape_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Optimization,Metric, Contrast, MinContrast : ModelID)
create_ncc_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric : ModelID)
两者相同的参数基本上应用设定上的含义也相同,除了最后一个模板ID是输出外,其他的参数都是输入的,都是要设定的,
1、Template,可以由gen_rectangle1()生成一个矩形后用reduce_domain()会得到这个图像区域的ROI;
2、NumLevels,金字塔的层数,一般设为‘auto’,由Halcon自动由模板图像计算出,层数太少,耗时,层数太多,有可能找不到对象;
3、AngleStart,产品搜索的开始角度,单位是弧度,一般根据产品放置的方向来决定,以向上12点钟方向为基准,Halcon默认参数是-0.39,转换为角度单位是-0.3960=-24度,就是以向上12点钟方向为基准,向左的逆时针的24度为识别的开始角度;
4、AngleExtent:从开始角度延伸的识别角度,单位也是弧度,Halcon默认参数是0.79,转换为角度单位是0.7960=48度,结合刚才的-24度,就是说设定的识别角度范围为负24-正24,以向上12点钟方向为基准。
5、AngleStep:识别的角度每一次的步进值,单位是弧度,一般设为‘auto’,由Halcon自动由模板图像计算出,步进太少,耗时,步进太多,有可能找不到对象;假如你自己想设定为0.02,转换为角度单位是0.02*60=1.2度,就是第一次识别为-24度,第二次-22.8度,第三次-21.6度。。。。。。
6、Optimization,一般设为‘auto’,由Halcon自动由模板图像计算出,对于模板尺寸比较大的话,会自动减少模板的候选边缘点,减少内存和加快速度;
7、Metric:设为’use_polarity’,就是产品和背景要跟你做模板时候一样的对比度;设为Ignor_polarity,就是不一样的对比度也能识别出来;
8、Contrast:一般设为‘auto’,决定边缘候选点和最小尺寸的单个的模板部分。
9、MinContrast:一般设为‘auto’,物体是否具有较低的对比度,如果要求物体在任何状态下都能被识别,则应减小MinContrast值;
10、ModelID:模板的ID号,一般从0开始,创建后由FindModel来调用;
find_shape_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap,SubPixel, NumLevels, Greediness : Row, Column, Angle, Score)
find_ncc_model(Image : : ModelID, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap,SubPixel, NumLevels : Row, Column, Angle, Score)
以上的参数除了最后的4个是输出的YX角度分数信息外,其他的参数都是要输入的,
1、Image:搜索图,可能包含多个产品;
2、ModelID:之前创建的模板的ID号;
3、AngleStart, AngleExtent,跟以上的创建模板的一样的解释;
4、MinScore:要识别的最小的分数值,0-1的范围,0越不像,1越像;
5、NumMatches:要识别的对象的个数,Halcon会将识别出来的多个对象的分数值进行从高到低的排序,只有大于设定的最小分数值的对象才能识别出来;
6、MaxOverlap:最大的重叠的范围,由模板的最小紧贴的有角度的包含的矩形来计算重合范围;
7、SubPixel:默认设为:‘least_squares’,如果不需要太高精度,设为none,坐标就没有小数点,设为interpolation,有小数点,就是多项式拟合出来的结果,不会占用太多时间,设为’least_square’,’lease_square_high’,精度最高但这样会增加额外的时间;
8、NumLevels是在搜索时使用的金字塔层数,如果NumLevels=0,使用创建模板时金字塔的层数。另外NumLevels还可以包含第二个参数,这个参数定义了找到匹配模板的最低金字塔层数。NumLevels=[4,2]表示匹配在第四层金字塔开始,在第二层金字塔找到匹配(最低的设为1)。
9、Greediness :默认0.9,搜索时的“贪婪程度”,Halcon作者说如果设置Greediness=0.9,在几乎所有的情况下,总能找到模型的匹配。设置的越小,越早退出判断的循环,越有可能找不到对象。
10、Row, Column,出来的YX坐标,可以包含多个对象
11、Angle, 出来的角度坐标,单位为弧度,由三点钟方向为基准,顺时针为正,逆时针为负;
12、Score:0-1的识别出来的分数值,0越不像,1越像;
最后退出程序或者更换品种,记得ClearShapeModel或者ClearNccModel一下;
市场上商用的其他工业软件库品牌收费和特点怎样呢?
Halcon:形状和灰度分别大概5K左右,只是运行版本;
MIL:形状5K,灰度2K;
Cognex:大概多少,得问下…
Malcon:性价比最高。