作者:知乎@Structure Light
链接:https://zhuanlan.zhihu.com/p/644238846
编辑:3DCV
一、技术路线
1. 硬件设备构成
如图1所示,双目结构光三维测量的硬件通常由单个DLP投影仪和一对双目相机组成,DLP用于投影光栅条纹到测量物体表面,然后通过触发信号至双目相机,并采集反射的条纹图像。

2. 测量原理
(1)编码方式通常采用相移+时域相位解包,目的是为了获取绝对相位信息。相移条纹获取包裹相位,时域相位解包方法,例如格雷码方法、多频外差方法、倍频方法、Phase-coding方法,对包裹相位解包,获取绝对相位信息。
(2)传统双目实现点与点的匹配依赖于物体的纹理特征,当物体表面纹理过于单一时,匹配的点稀疏且精度较差,结构光编码主动提供了相位信息,因此双目匹配过程中寻找相位相等的点便可以实现同名点确定,达到点与点成功匹配。
(3)如图2所示,同名点匹配之后便可以通过双目立体视觉结构并结合系统标定参数重建物体的三维坐标点。

二、相位编码与解码原理
如前所述,双目结构光的编码通常采用相移法+时域相位解包算法实现绝对相位获取,其中相移法投影相移条纹可以计算得到包裹相位,时域方法则投影对应的时域条纹图像得到条纹序列k,具体形式如图3所示。

当使用时域条纹获取到条纹序列κ之后,便可以对包裹相位ϕ进行展开得到绝对相位Φ,具体通过下述方程:

1. 四步相移法获取包裹相位
由于四步相移的高速和高精度性能,因此通常采用四步相移获取包裹相位信息。四步相移为四张相移互为π2的光栅条纹构成,其具体的数学表达式如下所示:

然后根据最小二乘法便可以求取包裹相位信息,具体如下:

由于包裹相位为一对多的函数形式,因此在进行双目匹配的时候会出现多个候匹配点,因此需要进行包裹相位展开得到单调递增的绝对相位。
2. 时域相位解包获取条纹序列
目前,主流的时域相位解包方法有格雷码方法、多频外差方法、倍频方法等等。如前所述,这些方法的目前是为了获取条纹序列,对包裹相位进行展开。但这些方法均各有优缺点,如图4所示,格雷码方法由于二值分割的误差会导致条纹序列与包裹相位的周期边界错位,解包之后绝对相位解包会出现相位跳变问题,传统的滤波方法难以完全滤除干净,且会污染非相干区域的相位精度。为了解决该问题,学者们发展出一系列改进的格雷码方法。但用于稳定测量的当属补码格雷码方法,该方法多加一张格雷码光栅投影,可以很好的解决相位跳变问题。

多频外差的解码原理如图5所示,利用不同频率的包裹相位进行差值得到更低频率的相位,然后再进行相位解包。在条纹的最初段和尾端,频率不同条纹的相位差最大,为−π或π。由于噪声的影响,包裹相位也包含误差,当受到噪声干扰,相位差为−π的区域可能小于−π,相位差为π的区域可能大于π。由于相位分布范围为[−π,π](或者为[0,2π]),因此小于−π的区域会变为π左右,大于π的区域会变为−π左右,便出现跳变情况,如图5的粉红色区域,该问题同样存在与倍频方法中。实际使用中,首尾两端的区域通常被舍弃使用便可以避免测量误差的问题。

三、双目点云重建
获取绝对相位信息之后,便可以利用双目视觉进行对应点匹配,基于相位的双目匹配需要使用双目系统参数,此外三维点云重建也需要双目系统参数,因此在测量之前需要对双目系统进行标定。
1. 双目标定
目前常用的双目标定方法为张氏标定法,Matlab、Opencv和Halcon等工具均提供了直接使用的标定函数,以Matlab为例,如图6所示,可以在命令行直接输入stereoCameraCalibrator或者直接在APP中找到该功能,打开之后直接点击Add Images上传自己采集的标定图像可以标定出双目系统参数。注意该功能暂时只支持棋盘格标定板的标定,如果使用圆形标定板,则需要自己配置找圆函数或者利用现有的圆心提取函数,并自己调用工具箱的标定函数。多年标定经验所得使用圆标定板的标定误差仅为棋盘格的一半左右,但当棋盘格的标定误差达到0.1像素之内,对于重建精度影响很小,因此棋盘格也是一种不错的标定方式。

标定之后得到的主要参数为两个相机各自的内参,既主点坐标,焦距和镜头畸变,此外还有两个相机之间的外参,既旋转矩阵和平移矩阵。推荐学习3D视觉工坊新出的课程:(第二期)从零搭建一套结构光3D重建系统[理论+源码+实践]
2. 基于相位的双目匹配
如图7所示,双目视觉中存在一个重要的理论,极线定理,既左相机成像中的一点,对应在右相机中的一条线,同样右相机的该条线上的一点对应在左相机成像点所处的某一极线。此对极线存在着对应的匹配点,利用极线可以极大缩小同相位点匹配的计算。由于绝对相位是单调递增的,因此在该对极线上可以找到相位值相等的点,也就是对应的同名点,遍历图像中的所有点,便可以快速和有效的实现双目匹配。

3. 三维坐标计算
利用双目极线和绝对相位信息实现双目匹配后,便可以求取三维坐标,假设空间中有一个点P,在左相机坐标系下的三维坐标为(x,y,z),在右相机坐标系下的三维坐标为(xr,yr,zr),其成像于左相机图像的点(ul,vl),通过相位匹配得到其对应在右相机图像的匹配点为(ur,vr)。根据相机的小孔成像模型,可以得到(ul,vl)与(x,y,z)的如下:

其中,sl为比例因子,flx和fly分别为x和y的焦距,(ul0,vl0)为主点坐标,同理可以得到右相机图像坐标与三维坐标的关系:

通过标定之后可以得到两个相机之间的外参关系,因此坐标(x,y,z)与(xr,yr,zr)的关系便可以被得到:

其中R和T分别为旋转矩阵和平移矩阵。联立上述三个方程便可以根据点(ul,vl)和(ur,vr)以及标定参数求取三维坐标点(x,y,z),具体公式如下:

四、实验测试
本次实验使用的双目相机均为海康威视的200w像素工业相机,投影仪为DLP 4500,触发为DLP发生信号同时触发双目相机。
1. 双目标定(基于棋盘格)

本次测试使用棋盘格进行双目系统的标定,一共标定了7组不同姿态的标定板,通过Matlab的工具箱得到标定的重投影误差为0.06 pixel。
2. 相位计算(基于相移+补码格雷码)
本次测量使用四步相移+补码格雷码的编码方式进行绝对相位的求取,双目图像的绝对相位求取如下图所示:

3. 三维点云重建
通过前述的三维坐标恢复公式,得到的三维点云如图10所示。测量通过评定误差1um的精度球,测量误差分布在0.02-0.05 mm。

高效学习3D视觉三部曲
第一步 加入行业交流群,保持技术的先进性
目前工坊已经建立了3D视觉方向多个社群,包括SLAM、工业3D视觉、自动驾驶方向,细分群包括:
[工业方向]三维点云、结构光、机械臂、缺陷检测、三维测量、TOF、相机标定、综合群;
[SLAM方向]多传感器融合、ORB-SLAM、激光SLAM、机器人导航、RTK|GPS|UWB等传感器交流群、SLAM综合讨论群;
[自动驾驶方向]深度估计、Transformer、毫米波|激光雷达|视觉摄像头传感器讨论群、多传感器标定、自动驾驶综合群等。
[三维重建方向]NeRF、colmap、OpenMVS、MVSNet等。
[无人机方向]四旋翼建模、无人机飞控等。
除了这些,还有求职、硬件选型、视觉产品落地等交流群。
大家可以添加小助理微信: dddvisiona,备注:加群+方向+学校|公司, 小助理会拉你入群。

第二步 加入知识星球,问题及时得到解答
3.1 「3D视觉从入门到精通」技术星球
针对3D视觉领域的视频课程(三维重建、三维点云、结构光、手眼标定、相机标定、激光/视觉SLAM、自动驾驶等)、源码分享、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答等进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业、项目对接为一体的铁杆粉丝聚集区,6000+星球成员为创造更好的AI世界共同进步,知识星球入口:「3D视觉从入门到精通」
学习3D视觉核心技术,扫描查看,3天内无条件退款
3.2 3D视觉岗求职星球
本星球:3D视觉岗求职星球 依托于公众号「3D视觉工坊」和「计算机视觉工坊」、「3DCV」,旨在发布3D视觉项目、3D视觉产品、3D视觉算法招聘信息,具体内容主要包括:
收集汇总并发布3D视觉领域优秀企业的最新招聘信息。
发布项目需求,包括2D、3D视觉、深度学习、VSLAM,自动驾驶、三维重建、结构光、机械臂位姿估计与抓取、光场重建、无人机、AR/VR等。
分享3D视觉算法岗的秋招、春招准备攻略,心得体会,内推机会、实习机会等,涉及计算机视觉、SLAM、深度学习、自动驾驶、大数据等方向。
星球内含有多家企业HR及猎头提供就业机会。群主和嘉宾既有21届/22届/23届参与招聘拿到算法offer(含有海康威视、阿里、美团、华为等大厂offer)。
发布3D视觉行业新科技产品,触及行业新动向。

第三步 系统学习3D视觉,对模块知识体系,深刻理解并运行
如果大家对3D视觉某一个细分方向想系统学习[从理论、代码到实战],推荐3D视觉精品课程学习网址:www.3dcver.com
科研论文写作:
基础课程:
[1]面向三维视觉算法的C++重要模块精讲:从零基础入门到进阶
[2]面向三维视觉的Linux嵌入式系统教程[理论+代码+实战]
工业3D视觉方向课程:
[1](第二期)从零搭建一套结构光3D重建系统[理论+源码+实践]
SLAM方向课程:
[1]深度剖析面向机器人领域的3D激光SLAM技术原理、代码与实战
[2]彻底剖析激光-视觉-IMU-GPS融合SLAM算法:理论推导、代码讲解和实战
[3](第二期)彻底搞懂基于LOAM框架的3D激光SLAM:源码剖析到算法优化
[4]彻底搞懂视觉-惯性SLAM:VINS-Fusion原理精讲与源码剖析
[5]彻底剖析室内、室外激光SLAM关键算法和实战(cartographer+LOAM+LIO-SAM)
机器人导航与路径规划
[1]移动机器人规划控制入门与实践:基于Navigation2
视觉三维重建:
[2]基于深度学习的三维重建MVSNet系列 [论文+源码+应用+科研]
自动驾驶方向课程:
[1] 深度剖析面向自动驾驶领域的车载传感器空间同步(标定)
[2] 国内首个面向自动驾驶目标检测领域的Transformer原理与实战课程
[4]面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
[5]如何将深度学习模型部署到实际工程中?(分类+检测+分割)
无人机:
[1] 零基础入门四旋翼建模与控制(MATLAB仿真)[理论+实战]