[Halcon&定位] 形状匹配和灰度匹配对比

简介: [Halcon&定位] 形状匹配和灰度匹配对比

工业视觉应用场景主要有两类:

第一类:运动控制类设备,如激光焊接和雕刻,丝印机,贴片机,数控机床等自动化设备,视觉就是模板匹配,先做好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时目标搜索不到。这个现象大多是模板轮廓提取不好存在干扰目标轮廓导致。

三、加快搜索匹配的方法

  1. 要匹配成功,则尽可能增加参数MinScore的值;(旋转对称和相似度)
  2. 增加Greediness值直到匹配失败,同时在需要时减小MinScore值;(贪婪度)
  3. 在创建模板时使用一个大的NumLevels,即将图像多分几个金字塔级;
  4. 限定允许的旋转范围和大小范围,在调用find_shape_model()时调整相应的参数;
  5. 尽量限定搜索ROI的区域;

四、确保稳定的检测结果方法

  1. 必须保证物体在图像边缘处截断,也就是保证轮廓的清晰,这些可以通过形态学的一些方法来处理;
  2. 如果Greediness值设的太高,就找不到其中一些可见物体,这时最后将其设为0来执行完全搜索
  3. 物体是否有封闭区域,如果要求物体在任何状态下都能被识别,则应减小MinScore值;
  4. 判断在金字塔最高级上的匹配是否失败,可以通过find_shape_model()减小NumLevels值来测试;
  5. 物体是否具有较低的对比度,如果要求物体在任何状态下都能被识别,则应减小MinContrast值;
  6. 判断是否全局地或者局部地转化对比度极性,如果需要在任何状态下都能被识别,则应给参数Metric设置一个合适的值;
  7. 物体是否与物体的其他实例重叠,如果需要在任何状态下都能识别物体,则应增加MaxOverlap值;
  8. 判断是否在相同物体上找到多个匹配值,如果物体几乎是对称的,则需要控制旋转范围;

参考:说说Halcon的形状匹配和灰度匹配

 


戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。


目录
相关文章
|
人工智能 算法 定位技术
基于等照度线和窗口匹配的图像修补算法
基于等照度线和窗口匹配的图像修补算法
|
6月前
|
编解码 计算机视觉 索引
OpenCV使用单目标匹配从图像中选择最佳的匹配结果及查找重复图像实战(附Python源码)
OpenCV使用单目标匹配从图像中选择最佳的匹配结果及查找重复图像实战(附Python源码)
219 0
|
Linux
【PyAutoGUI操作指南】05 屏幕截图与图像定位:截图+定位单个目标+定位全部目标+灰度匹配+像素匹配+获取屏幕截图中像素的RGB颜色
【PyAutoGUI操作指南】05 屏幕截图与图像定位:截图+定位单个目标+定位全部目标+灰度匹配+像素匹配+获取屏幕截图中像素的RGB颜色
1052 0
|
3月前
|
机器学习/深度学习 算法 数据可视化
利用网格搜索对超参数进行调节
【8月更文挑战第8天】利用网格搜索对超参数进行调节。
38 1
|
1月前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
48 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
4月前
|
文字识别
文本,文字识别,PaddleOCR,如何删除,PaddleOCR详解,检测,方向分类器,识别,检测的意思是检查字符的位置,查像素坐标,方向分类器,能够实现180度的图像,字符识别是把识别字符
文本,文字识别,PaddleOCR,如何删除,PaddleOCR详解,检测,方向分类器,识别,检测的意思是检查字符的位置,查像素坐标,方向分类器,能够实现180度的图像,字符识别是把识别字符
|
5月前
|
定位技术
腾讯地图的(地图选点|输入模糊匹配)
腾讯地图的(地图选点|输入模糊匹配)
|
6月前
|
C++
[Halcon&定位] 解决Roi区域外的模板匹配成功
[Halcon&定位] 解决Roi区域外的模板匹配成功
205 0
|
6月前
[3D&Halcon] 三维点云匹配&无序抓取
[3D&Halcon] 三维点云匹配&无序抓取
331 0
|
算法 固态存储
分别使用SAD匹配,NCC匹配,SSD匹配三种算法提取双目图像的深度信息
分别使用SAD匹配,NCC匹配,SSD匹配三种算法提取双目图像的深度信息
172 0
分别使用SAD匹配,NCC匹配,SSD匹配三种算法提取双目图像的深度信息