线激光测量胶水高度

  • 1. 项目背景介绍
  • 2. 基恩士线激光的设置
  • 3. 使用Halcon处理深度图
    • 3.1 线激光高度数据转为深度图
  • 5. Halcon图像处理方法
  • 6. Halcon代码

1. 项目背景介绍

  • 最近参与了一个锂电池UV点胶机的项目,其中对胶水高度(胶水最高点到基准面的距离)的测量,选用的是基恩士LJ-V7001线激光。
  • 如下图,灰色矩形代表电芯,蓝色条状物就是UV胶,线激光的测量线与UV胶边缘垂直,沿着箭头方向移动,直到扫描完整条边缘。
  • 下图是点完UV胶后电池的截面图,线激光就是要测量T1和T2的值。

2. 基恩士线激光的设置

  • 线激光的使用相较与相机来说,复杂一些,这里说一下本项目中的简单设置。
  • 线激光的基本设置都可以在LJ-Navigator这个软件中进行,
  • 需要注意的有:
    • 触发模式:编码器触发、连续触发(调试时实时查看效果)
    • 批处理:是否使用批处理,以及批处理的点数。如果使用了批处理,当采集完设定点数后,回调函数会自动被调用,返回所有数据。
    • 需要注意的是,当你使用两个激光头时,返回的数据会将两个激光头的数据拼接到一起返回。
  • 在自动运行时,我们一般使用高速,这样传输数据更快。

3. 使用Halcon处理深度图

3.1 线激光高度数据转为深度图

  • 下图就是使用高度数据转深度图的效果,具体的方法参考:Halcon 3D点云和深度图的相互转化
      Z = bufferArray;HTuple X, Y;HOperatorSet.GenImageConst(out ho_Image, "real", width, height);HOperatorSet.GetRegionPoints(ho_Image, out X, out Y);HOperatorSet.SetGrayval(ho_Image, X, Y, Z);

5. Halcon图像处理方法

  • 先把电芯区域抠图出来
  • 当我们去其中一行数据进行分析时会发现一个问题,那就是基准面是倾斜的,如果直接用胶水的高度减去基准面的高度计算的结果一定是错的。所以我们需要找到胶水的最高点,然后计算最高点到基准线的垂直距离。
  • 当然其中还有一点需要注意,那就是应该如何判断一个点是在基准线上方还是下方,比如最右边也就是最边缘的点距离基准线的距离也比较远,但它明显不是胶水的最高点,我们可以通过基准线两个端点和当前被计算的点之间形成的角度来判断。具体实现可以看下面的代码。

6. Halcon代码

*dev_update_off ()
read_image (Image1, 'B1.tif')gen_rectangle1 (ROI, 1.39873, 19.5497, 1184.31, 777.679)* 获取电芯区域和图像
GetCellRegion (Image1, ROI, RegionTop, RegionBottom, ImageReducedTop, ImageReducedBottom)cut1:=10
cut2:=10X_Offset1:=40
X_Offset2:=75X_Measure1:=3
X_Measure2:=45* 计算T1T2
CalculateT1T2 (RegionTop, ImageReducedTop, RegionBottom, ImageReducedBottom, \cut1, cut2, X_Offset1, X_Offset2, X_Measure1, X_Measure2, T1, T2)*dev_update_on ()
  • GetCellRegion
* 获得传感器上下图像
reduce_domain (Image1, ROI, ImageReduced)
threshold (ImageReduced, Regions, -500000, 500000)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 32450.4, 1000000)
sort_region (SelectedRegions, SortedRegions, 'character', 'true', 'row')
select_obj (SortedRegions, RegionBottom, 1)
select_obj (SortedRegions, RegionTop, 2)
reduce_domain (ImageReduced, RegionBottom, ImageReducedBottom)
reduce_domain (ImageReduced, RegionTop, ImageReducedTop)
return ()
  • CalculateT1T2
smallest_rectangle1 (RegionTop, Row1, Column1, Row2, Column2)
Row1:=Row1+cut1
Row2:=Row2-cut2
rowNum:=Row2-Row1lineX:=[]
lineY:=[]measureX:=[]
measureY:=[]T1Tmp:=[]gen_empty_obj (glueCrossT)
gen_empty_obj (glueCrossB)for Index := 0 to rowNum-1 by 1gen_rectangle1 (Rectangle, Row1+Index, Column1, Row1+Index+1, Column2)intersection (Rectangle, RegionTop, RegionIntersection)get_region_points (RegionIntersection, Rows, Columns)* 整体高度曲线get_grayval (ImageReducedTop, Rows, Columns, Grayval) tuple_median (Grayval, Median)Grayval:=(Grayval-Median)/1000tuple_gen_sequence (1, |Grayval|, 1, X)Y:=Grayvalgen_contour_polygon_xld (Contour, Y, X)* 拟合基准直线if(|Grayval|-X_Offset2>0)tuple_gen_sequence (|Grayval|-X_Offset2, |Grayval|-X_Offset1, 1, lineX)lineY:=Y[|Grayval|-X_Offset2:|Grayval|-X_Offset1]gen_contour_polygon_xld (contour, lineY, lineX)fit_line_contour_xld (contour, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)gen_contour_polygon_xld (std_line, [RowBegin,RowEnd], [ColBegin,ColEnd])* 选择测量区间tuple_gen_sequence (|Grayval|-X_Measure2, |Grayval|-X_Measure1, 1, measureX)measureY:=Y[|Grayval|-X_Measure2:|Grayval|-X_Measure1]* 判断点在直线的上方还是下方* 如果点在直线下方,则认为没有胶水,高度为0* 使用角度判断tuple_gen_const (|measureX|, ColBegin, NewColBegin)tuple_gen_const (|measureX|, RowBegin, NewRowBegin)tuple_gen_const (|measureX|, ColEnd, NewColEnd)tuple_gen_const (|measureX|, RowEnd, NewRowEnd)angle_ll (NewColBegin, NewRowBegin, NewColEnd, NewRowEnd,\NewColEnd, NewRowEnd, measureX, measureY, Angle)ag:=deg(Angle)distance_pl (measureX, measureY, ColBegin, RowBegin, ColEnd, RowEnd, Distance)for I := 0 to |ag|-1 by 1if (ag[I]>0)Distance[I] :=0endifendfortuple_max (Distance, Max)T1Tmp:=[T1Tmp,Max]*         dev_clear_window ()
*         dev_set_color ('red')
*         dev_display (Contour)
*         dev_set_color ('blue')
*         dev_display (std_line)*      stop()endifendfor* T1平均处理
num:=50
T1:=[]
for I := 0 to |T1Tmp|-num-1 by 1tuple_median (T1Tmp[I:I+num], Median)T1[I]:=Median
endforT1:=T1/100* dev_clear_window ()
* tuple_gen_sequence (1, |T1|, 1, X)
* Y:=T1*1000
* gen_contour_polygon_xld (Contour1, Y, X)* dev_display (Contour1)* stop()**************下面
* 获得单独一行的高度曲线图
smallest_rectangle1 (RegionBottom, Row1, Column1, Row2, Column2)Row1:=Row1+cut1
Row2:=Row2-cut2
rowNum:=Row2-Row1lineX:=[]
lineY:=[]measureX:=[]
measureY:=[]MaxDist:=[]
T2Tmp:=[]
for Index := 0 to rowNum-1 by 1gen_rectangle1 (Rectangle, Row1+Index, Column1, Row1+Index+1, Column2)intersection (Rectangle, RegionBottom, RegionIntersection)get_region_points (RegionIntersection, Rows, Columns)* 整体高度曲线get_grayval (ImageReducedBottom, Rows, Columns, Grayval) tuple_median (Grayval, Median)Grayval:=(Grayval-Median)/1000tuple_gen_sequence (1, |Grayval|, 1, X)Y:=Grayvalgen_contour_polygon_xld (Contour, Y, X)* 拟合基准直线if(|Grayval|-X_Offset2>0)tuple_gen_sequence (|Grayval|-X_Offset2, |Grayval|-X_Offset1, 1, lineX)lineY:=Y[|Grayval|-X_Offset2:|Grayval|-X_Offset1]gen_contour_polygon_xld (contour, lineY, lineX)fit_line_contour_xld (contour, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)gen_contour_polygon_xld (std_line, [RowBegin,RowEnd], [ColBegin,ColEnd])* 选择测量区间tuple_gen_sequence (|Grayval|-X_Measure2, |Grayval|-X_Measure1, 1, measureX)measureY:=Y[|Grayval|-X_Measure2:|Grayval|-X_Measure1]tuple_gen_const (|measureX|, ColBegin, NewColBegin)tuple_gen_const (|measureX|, RowBegin, NewRowBegin)tuple_gen_const (|measureX|, ColEnd, NewColEnd)tuple_gen_const (|measureX|, RowEnd, NewRowEnd)angle_ll (NewColBegin, NewRowBegin, NewColEnd, NewRowEnd,\NewColEnd, NewRowEnd, measureX, measureY, Angle)ag:=deg(Angle)distance_pl (measureX, measureY, ColBegin, RowBegin, ColEnd, RowEnd, Distance)for I := 0 to |ag|-1 by 1if (ag[I]<0)Distance[I] :=0endifendfortuple_max (Distance, Max)T2Tmp:=[T2Tmp,Max]dev_clear_window ()dev_set_color ('red')dev_display (Contour)dev_set_color ('blue')dev_display (std_line)stop()endifendfor* T1平均处理
num:=50
T2:=[]
for I := 0 to |T2Tmp|-num-1 by 1tuple_median (T2Tmp[I:I+num], Median)T2[I]:=Median
endforT2:=T2/100return ()

3D视觉——线激光测量胶水高度相关推荐

  1. 显扬科技3D视觉 | 线激光vs双目结构光

    线激光测量装置需要移动,占用的工作空间较大,且设备复杂,分辨率和景深影响拍摄节拍,通常拍摄一次需要几秒钟不等.针对不同被测物体需要重新进行真个装置的调试,因此通用性(柔性)较差. 而双目结构光,其实就 ...

  2. 3D视觉之线激光3D相机

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨飞鸢逐浪@知乎 来源丨https://zhuanlan.zhihu.com/p/48651663 ...

  3. 3D视觉 之 线激光3D相机

    3D视觉 之 线激光3D相机 飞鸢逐浪 专注于机器视觉.OpenCV.C++编程 84 人赞同了该文章 1 3D 视觉 常见的三维视觉技术,包含双目.ToF.激光三角.结构光等,如下图: 1)毫米级 ...

  4. 基于matlab单目视觉焊缝跟踪系统,基于激光线结构光3D视觉的机器人轨迹跟踪方法与应用...

    摘要: 本文利用工控机.图像采集卡.工业相机和激光器,设计了激光线结构光3D视觉系统;利用工控机.运动控制卡.伺服驱动器和六轴串联机器人组成机器人运动系统;两者共同构成基于激光线结构光的机器人轨迹跟踪 ...

  5. 3D视觉——基恩士LJ-X系列线激光

    基恩士LJ-X系列线激光 1. 基恩士硬件和软件的调试 1.1 下载并安装软件 LJ-X Navigator 和 LJ-X Observer 1.2 将控制器与电脑连接,接上24V电源就可以使用了. ...

  6. 机器视觉硬件篇--线激光3d相机介绍及编程

    一.3D相机简介 常见的三维视觉技术,包含双目.ToF.激光三角.结构光等 毫米级:双目.ToF.结构光(散斑)的精度为 mm 级,多见于消费领域,如:导航避障,VR/AR,刷脸支付等 微米级:线激光 ...

  7. 在线3D平面度检测机 大理石平台设计线激光3D成像技术

    [品牌]中天智能 [型号]ZTi-MLS300 [产地]东莞 [机架结构]大理石 [测量硬件]3D线激光 [测量尺寸类型]平面度.翘曲度.高度差.3D轮廓等 [测量工位]双工位 [产品上下料方式]流水 ...

  8. matlab 光平面标定代码,线结构光视觉传感器/线激光深度传感器标定工具(matlab)...

    线结构光视觉传感器/线激光深度传感器标定工具(matlab) 发布时间:2018-03-13 17:32, 浏览次数:655 , 标签: matlab 线结构光视觉系统有着结构简单.使用灵活.受周围光 ...

  9. 线结构光视觉传感器/线激光深度传感器标定工具

    续集:线结构光视觉传感器/线激光深度传感器标定工具(续) https://jah10527.github.io/articles/lineLaser.html 线结构光视觉系统有着结构简单.使用灵活. ...

最新文章

  1. 亲历dataguard的一些经验问答题
  2. ABAP几种内表的操作
  3. javaweb家居用品线上销售系统_智能家居订单管理系统方案设计路线
  4. Session的异常
  5. ue4缓存位置怎么改_怎么从蓝图节点跳转到C++源码?
  6. 剖析ActiveX控件安全问题
  7. Android架构实例分析之编写hello驱动的HAL层代码
  8. Python 练习: 简单角色游戏程序
  9. 服务器上如何修改伪静态,服务器如何设置伪静态和301重定向
  10. python优先队列,队列和栈
  11. CYQ.Data 轻量数据层之路 框架如何应对数据库变化
  12. 秒表的检定及设备使用方法说明
  13. api. feel.ai_如何使用Api.ai构建自己的AI助手
  14. 古诗词取名小工具1.0
  15. 圣水盆景区是闾山最著名的景点
  16. environment-modules安装配置
  17. 股票中的KDJ三根线分别代表什么?
  18. 根据Magic Number(幻数)判断文件类型
  19. 运动APP软件开发具有什么好处?
  20. 小程序php好物优购毕业设计-附源码191755

热门文章

  1. 对拼多多优惠券事件的思考,理解流程为何如此重要
  2. 基于SSM实现餐厅收银系统
  3. 图解:HTTP 范围请求,助力断点续传,多线程下载的核心原理 | 实用HTTP
  4. SRS Audio Sandbox(终极的音频增强软件)
  5. 拆解金融科技Q3业绩:增长、迭代与飞轮效应
  6. svn服务端删除版本库_删除SVN目录及从服务器端删除SVN版本库文件方法详解
  7. MinkowskiEngine安装问题
  8. 用龙芯1c库实现无源蜂鸣器唱歌《送别》
  9. 先科n612打不开但是充电还是会亮红灯
  10. 关于 “<”运算符是为将来使用而保留的。 的解决办法