激光三角法点云重建分享——halcon 方法

时间:2021-10-23 20:43:35

如今视觉应用方面单纯依靠2D图像解决问题存在很多问题、稳定性差、定位不准确、还有配合机器人抓取方面只能抓高度一致的物品。
其实在Halcon算法库有非常强大的三维算法。
包括点云重建、激光三角法(2D相机加一个激光器即可),结构光相机、散斑相机。
三维的算法、物体尺寸测量、物体的三维定位、三维物体的匹配。

内容比较多、容我慢慢分享。
1.点云数据的获取

目前比较常用的3D相机(工业领域)、主要是结构光相机和散斑相机。散斑相机相对来说价格比较便宜但精度比较差5k rmb以内 Kinect 奥比中光 之类,精度5mm---30mm之间 并附带2d 图片信息、视野都比较大、体积小巧。
结构光相机 主要是 编码结构光 相机 和线激光相机。这种相机的精度根据视野而定。小视野相机 基本上都是um及精度
编码结构光相机 比较复杂。
但是线激光相机基本上就非常简单了、如果不是要求特别高的精度 完全可以用 2D相机加激光线 自己组装一台根据不同视野 精度基本 在 0.1mm到1mm之间。常规项目上能够满足。
先上一个详细的讲解(从论文里找到的)链接:https://pan.baidu.com/s/1bPApLfoX3SY0JMFNdOhLtQ 密码:78l7
等有时间的时候 再码字

更新:

先解析一下标定 激光三角法的例子calibrate_sheet_of_light_calplate.hdev

准备工作(搭建环境)
2D相机一个
选择2d相机时有个原则是帧率越高越好
目前usb3.0相机的帧率都比较高、但usb线是容易受到干扰丢帧。
根据三角成像原理、激光线条成像所占像素是在一定范围之内的
假设相机像素(1280X960)激光条成像范围跟激光器安装夹角有关。
有一点需要注意 超出相机景深时成像比较模糊 精度会变的很差
假设激光器与相机夹角 30度  结合相机实际景深 ,激光条成像像素基本在400像素以内变化
(1280X960)的分辨率有一部分像素是闲置用不上的。
此时需要设置一下相机的ROI 。
相机有一个特点、ROI越小相机的帧率越高

  例如网口相机、千兆网相机。相机最大的数据吞吐量是每秒千兆、
(1280X960)像素1228800 为 1228800字节  约等于 1.17MB
  网口数据量最大 120MB每秒
  因此 这种情况下 最大理论帧数 =120/1.17=102贞/s
  实际情况下 很难达到最高理论速度,因此相机的帧率受到限制
  但是 把相机的ROI改小 就会有另一种效果了。
  相机 数据传输 之传输 ROI设置部分数据。
  例如(1280X300)相机帧率就会提升很多(前提是相机支持这种模式)
  另外和成品的激光扫描相机相比 成品相机的帧率 会非常高400--600 贞每秒  !成品相机中 会使用移轴镜头(自行百度原理)进一步压缩像素范围。
}
将相机设置成多帧触发模式
设置相机的采集帧率(此参数标定扫描方向时会用到)
设置相机的采集贞数、此参数根据实际场景会 经常变化

扫描时间t=扫描长度/扫描速度
采集帧数 N=t*帧率;
采集帧数根据 扫描长度 和速度 动态变化。
相机 的多帧采集 通常是 给一次触发 以设置的采集速率 采集N张图片
达到设定帧数时自动停止。(需要注意的是相机的曝光时间一定要合理、如果曝光时间太大、是无法达到设定的采集速率的)

另外需要获得的图像是激光线条、可以根据实际情况使用滤波片提高抗干扰能力。
标定相机的时候、为了拍全标定板 可以将相机ROI放开。实际使用时在设置一个小的

激光器一个
运动机构
滑台、直线模组 或 机器人

总体上分三部分
1.相机内外参数的标定
2.光学平面的标定(激光器光线形成的平面标定)
3.运动方向的

1.第一部分比较常规 按照 标定相机 参数的方法进行即可
(初始化参数 采集图片 标定)
最终得到 
相机外参 CameraPose 
相机内参 CameraParameters

2.第二部分比较难理解(详细的原理说明参考网盘论文)
需要准备4张图片 
采集一张标定板图片  和当前状态下的激光线图片
调整高度与上一个采集位置形成高度差 再次采集一张标定板 图片和激光图片
按照流程标定即可。
最终得到 LightPlanePose

3.第三部分比较特别
按照正常标定时 采集在直线模组上 两个位置上的标定板图片完成标定即可。
得到 MovementPose
但是 如果保证 激光线 垂直于扫描方向进行扫描时 可以不用标定

MovementPose 是7位Htuple数据 第1位和第3位是激光线移动倾斜的矫正
如果对精度要求不高 并且保证 激光线与扫描方向大致垂直 填零即可 。
第二位的含义是 每采集一张图片 扫描多少距离 单位米。
可间接得到 MovementPose[1]=(扫描速度m/s)/(相机每秒的采样数量)
剩下4位直接填0即可。

未完!等待更新。。。。。。