工业视觉应用场景主要有两类:
第一类:运动控制类设备,如激光焊接和雕刻,丝印机,贴片机,数控机床等自动化设备,视觉就是模板匹配,先做好Mark点,然后在生产中快速进行形状或者灰度模板匹配,定位产品的位置,最后进行焊接或者贴合的工艺动作。这种设备量产最多,市场同行之间竞争很激烈,基本上是标准机,对模板匹配的速度和精度都有很高的要求,一台机器里往往有几个相机和十几个轴,对成本控制的非常严格。
第二类:AOI检测设备,如检孔机、PCB和手机玻璃外观检测,目前很多是非标机,根据客户要求来订制光源镜头相机,视觉功力要深厚些,基本上是先定位,再检测。定位用到的很多是形状或者灰度匹配。
说到这里,回到本文的主题,到底形状和灰度有什么差别或者优缺点呢?Halcon的算子的参数怎么设定呢?可以分别应用在什么场合呢?市场上商用的其他工业软件库品牌收费和特点怎样呢?
推荐看看中国的Malcon跟德国的Halcon的相比的优缺点
一、模板匹配特点:
形状匹配,find_shape_model,顾名思义,就是用产品的形状来做匹配,或者说是产品边缘来做匹配,Halcon的形状匹配可以做到即使存在严重遮挡、混乱或非线性光照变化,也能实现极高的识别率;
灰度匹配,find_ncc_model,就是框什么就识别什么,不仅识别产品的边缘,也识别产品本身的内部的信息,即使存在线性均匀的光照变化,也能识别,非线性的光照变化的话,识别不了,出来的分数很低。有个相似度的公式,比较复杂,这里就不做说明,感兴趣可以网上搜索下,很多资料。
优缺点和应用场合分析:
Shape形状匹配: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]表示匹配在第4层金字塔开始,并跟踪匹配到第2个金字塔级别(最低的设为1)。该机制可用于减少匹配的运行时间。
9、Greediness :默认0.9,搜索时的“贪婪程度”,这个值在很大程度上影响着搜索速度,若为0,则为启发式搜索,很耗时,若为1,则为不安全搜索,速度最快但找丢模板的几率也更大。在大多数情况下,在能够匹配的情况下,尽可能的增大其值,推荐值0.7-0.9。
10、Row, Column:出来的YX坐标,可以包含多个对象
11、Angle:出来的角度坐标,单位为弧度,由三点钟方向为基准,顺时针为正,逆时针为负;
12、Score:0-1的识别出来的分数值,0越不像,1越像;
最后退出程序或者更换品种,记得ClearShapeModel或者ClearNccModel一下;
金字塔层数直接影响到检测的准确性及稳定性,在实际项目模板匹配查找不到目标时,创建合适的金字塔层数、合适的对比度数据非常重要。有一个现象不知大家遇到过没有,查找限制分数设置为0.5以下时,查找结果得分会大于0.8以上,一但将查找限制分数设置到0.7时目标搜索不到。这个现象大多是模板轮廓提取不好存在干扰目标轮廓导致。
三、加快搜索匹配的方法:
- 要匹配成功,则尽可能增加参数MinScore的值;(旋转对称和相似度)
- 增加Greediness值直到匹配失败,同时在需要时减小MinScore值;(贪婪度)
- 在创建模板时使用一个大的NumLevels,即将图像多分几个金字塔级;
- 限定允许的旋转范围和大小范围,在调用find_shape_model()时调整相应的参数;
- 尽量限定搜索ROI的区域;
四、确保稳定的检测结果方法:
- 必须保证物体在图像边缘处截断,也就是保证轮廓的清晰,这些可以通过形态学的一些方法来处理;
- 如果Greediness值设的太高,就找不到其中一些可见物体,这时最后将其设为0来执行完全搜索
- 物体是否有封闭区域,如果要求物体在任何状态下都能被识别,则应减小MinScore值;
- 判断在金字塔最高级上的匹配是否失败,可以通过find_shape_model()减小NumLevels值来测试;
- 物体是否具有较低的对比度,如果要求物体在任何状态下都能被识别,则应减小MinContrast值;
- 判断是否全局地或者局部地转化对比度极性,如果需要在任何状态下都能被识别,则应给参数Metric设置一个合适的值;
- 物体是否与物体的其他实例重叠,如果需要在任何状态下都能识别物体,则应增加MaxOverlap值;
- 判断是否在相同物体上找到多个匹配值,如果物体几乎是对称的,则需要控制旋转范围;
戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。 |