2、深度相机原理:结构光、ToF、双目立体视觉。深度图与RGB图的配准
好,咱们进入第二章。这一章我打算聊聊深度相机的几种主流方案。说白了,就是机器怎么“看”出物体的远近。
你可能用过Kinect、Intel RealSense,或者手机上的结构光人脸解锁。这些设备背后,无非是三种技术路线:结构光、ToF(飞行时间)、双目立体视觉。我这些年做动作捕捉,三种都折腾过,各有各的脾气。
2.1 结构光:投影编码,三角测距
结构光的思路很直接。我朝物体上投射一个已知图案,比如散斑、条纹。然后用一个摄像头拍下这个图案。因为物体表面凹凸不平,图案会变形。通过分析变形量,就能算出深度。
核心原理: 投影仪和摄像头构成一个三角形。已知投影图案的编码,摄像头看到某个点偏移了多少,就能用三角法算出距离。
关键公式(简化版):
深度 Z = (基线距离 B × 焦距 f) / (视差 d)
这里的视差 d,就是投影点与参考点之间的像素偏移。
我在项目中遇到过一个问题:结构光在室外强光下基本就废了。太阳光里的红外成分会淹没投影的散斑。所以,结构光更适合室内、暗光环境。
我的经验: 如果你做近距离(0.3-3米)的人脸或手势识别,结构光精度很高。但别指望它在阳光下干活。
2.2 ToF:直接测光速,简单粗暴
ToF(Time of Flight)就一个字:快。它发射一束调制过的光,然后测量光从发射到返回的时间。光速是已知的,时间差一除,距离就出来了。
两种主流方式:
- 连续波调制(CW-ToF): 发射正弦波,通过相位差算距离。精度高,抗干扰强。
- 脉冲调制(Pulse-ToF): 直接测脉冲飞行时间。简单,但需要高精度计时器。
嗯,这里要注意。ToF的精度受限于时间测量分辨率。1纳秒对应30厘米。所以想做到毫米级,需要皮秒级的计时能力。这也是为什么早期ToF芯片贵。
避坑指南: 我曾经在反光物体上吃过亏。ToF遇到镜面、黑胶带,数据会飞掉。因为反射光太强或太弱,接收器饱和了。后来我加了多频调制,才勉强压住噪声。
2.3 双目立体视觉:模仿人眼,纯被动
双目立体视觉,说白了就是模仿人的两只眼睛。两个摄像头相隔一定距离(基线),同时拍下同一场景。然后通过匹配左右图像中的对应点,算出视差,再转成深度。
核心流程:
- 标定: 先标定两个相机的内参和外参。
- 校正: 把左右图像拉平,让对应点在同一行上。
- 匹配: 用块匹配或SGM算法找对应点。
- 三角化: 根据视差算深度。
双目最大的优势是:不需要主动光源。所以室外、远距离(几十米)都能用。但缺点也很明显——计算量大,而且对纹理敏感。白墙、光滑地面,匹配算法直接崩溃。
我的经验: 做动作捕捉时,我更喜欢双目+结构光融合。双目提供远距离轮廓,结构光补充近距离细节。别死磕一种方案。
2.4 三种方案对比
| 特性 | 结构光 | ToF | 双目立体视觉 |
|---|---|---|---|
| 测距方式 | 三角法 | 飞行时间 | 三角法 |
| 精度 | 高(毫米级) | 中(厘米级) | 中(厘米级) |
| 室外表现 | 差 | 中 | 好 |
| 计算量 | 低 | 低 | 高 |
| 典型距离 | 0.3-5米 | 0.5-10米 | 0.5-50米 |
| 代表产品 | Kinect v1, RealSense | Kinect v2, iPhone X | ZED, 大疆 |
2.5 深度图与RGB图的配准
拿到深度图还不够。我们做动作捕捉,最终要的是“彩色图像上每个像素的3D坐标”。这就需要把深度图和RGB图对齐。
配准的本质: 把深度相机坐标系下的点,投影到彩色相机坐标系下。
公式很简单:
P_rgb = R * P_depth + T
其中 R 和 T 是深度相机到彩色相机的旋转和平移矩阵。这个矩阵需要通过联合标定得到。
我建议你这样做:
- 先分别标定深度相机和彩色相机的内参。
- 然后拍摄一组棋盘格,同时记录深度图和RGB图。
- 用OpenCV的
stereoCalibrate函数算出R和T。
避坑指南: 我曾经直接用厂家给的标定参数,结果配准后边缘有重影。后来发现,深度相机和彩色相机之间有微小的温度漂移。建议每次开机后预热5分钟再标定。
配准后的结果,就是一张“对齐的RGB-D图像”。每个像素同时有颜色和深度信息。这是后续姿态估计的基础。
2.6 知识体系总览
下面这张图,是我自己画的。它把三种深度相机原理和配准流程串在了一起。你一看就明白。
你看,三种方案各有千秋。结构光精度高但怕光,ToF速度快但怕反光,双目不怕光但怕没纹理。配准这一步,就是把它们的深度信息,和彩色图像对齐,为后续的姿态估计打好基础。
好了,这一章就到这里。记住:没有完美的深度相机,只有合适的方案。选型时多想想你的场景——室内还是室外?近距离还是远距离?动还是静?想清楚了,再动手。