3、深度感知技术:双目立体视觉原理、结构光与ToF技术对比、深度图与点云数据格式

深度感知,说白了就是让相机拥有「看穿世界」的能力。我做了这么多年嵌入式视觉,最深的感触是:没有深度信息,AI 就像个瞎子。你想想看,一张平面照片里,人和背景是粘在一起的,机器根本分不清谁在前谁在后。

这一章,我们聊聊三种主流的深度感知技术。我会结合自己踩过的坑,把原理讲透。

3.1 双目立体视觉:像人眼一样看世界

双目立体视觉的原理,其实模仿的就是人眼。两只眼睛从不同角度观察同一个物体,大脑通过视差计算出距离。相机也一样——左右两个镜头拍下两张图,算法找出对应点,然后算深度。

核心公式很简单:

深度 Z = (焦距 f × 基线距离 B) / 视差 d

其中视差 d 是左右图中同一个点在 x 方向上的像素差。基线 B 是两个镜头的光心距离。

关键点:视差越大,物体越近;视差越小,物体越远。如果视差为零,说明物体在无穷远。

我在项目中遇到过一个问题:室外强光下,左右图的亮度差异很大,导致匹配算法直接崩了。后来我加了自适应直方图均衡化,才勉强稳住。嗯,这里要注意——光照一致性是双目系统的命门。

双目立体视觉的优缺点:

  • 优点:硬件成本低(两个普通摄像头就行),功耗小,适合嵌入式设备
  • 缺点:计算量大(尤其是立体匹配),对纹理敏感(白墙直接废掉),基线限制了测量范围

避坑指南:我曾经在室内白墙上做测试,结果深度图一片漆黑。后来才意识到——双目需要纹理!解决办法是投影一个随机点阵,或者换结构光方案。

3.2 结构光与ToF:主动光方案的对决

双目是被动方案,靠环境光吃饭。结构光和ToF则是主动发光,自己照亮世界。

结构光:投影编码图案

结构光的工作原理是:投影仪打出已知图案(比如散斑点、条纹),相机拍下变形后的图案,通过图案的形变计算出深度。

我最早接触结构光是在手机人脸识别上。苹果的FaceID用的就是点阵投影器——投射3万个红外点,然后计算深度。说实话,这个方案在近距离(0.2-1米)精度极高,能达到亚毫米级。

但结构光有个致命弱点:室外阳光下基本废掉。太阳光里的红外成分会淹没投影信号。我曾经在户外测试,深度图全是噪点,根本没法用。

ToF:直接测量光飞行时间

ToF(Time of Flight)的原理更直接:发射光脉冲,测量反射光回来的时间,然后算距离。

深度 = (光速 × 飞行时间) / 2

ToF 分为两种:

  • dToF(直接飞行时间):测量单个光脉冲的往返时间,精度高但电路复杂
  • iToF(间接飞行时间):通过测量发射光和接收光的相位差来推算时间,成本低但精度稍差

我个人习惯在机器人避障场景用ToF。它的优势是:帧率高(30fps以上),不受纹理影响,室外也能用。但分辨率普遍偏低(目前主流是QVGA级别),而且多机干扰是个大问题——两台ToF互相照,数据就乱了。

三种技术对比

维度 双目立体视觉 结构光 ToF
工作原理 视差三角测量 图案形变计算 光飞行时间
精度 中等(毫米级) 高(亚毫米级) 中等(厘米级)
测量范围 0.1m - 100m+ 0.1m - 5m 0.1m - 10m
室外性能 好(依赖光照) 差(阳光干扰)
纹理依赖
功耗
典型应用 自动驾驶、无人机 人脸识别、3D扫描 机器人避障、AR

重要提醒:选型时别只看精度。我曾经在项目里选了高精度的结构光,结果客户要求室外使用,最后不得不换方案。一定要先明确使用场景,再选技术。

3.3 深度图与点云:两种数据格式

深度感知的最终输出,无非两种形式:深度图或点云。我刚开始做的时候也搞混过,这里说清楚。

深度图:二维矩阵存距离

深度图本质上是一张灰度图,每个像素的值代表该点的深度(距离)。格式通常是16位或32位浮点,单位是毫米或米。

// 深度图数据示例(16位,单位毫米)
uint16_t depth_map[640][480];
// 访问第100行第200列的深度值
uint16_t depth_value = depth_map[200][100]; // 注意:行是y,列是x

深度图的优点是:数据紧凑,处理方便。可以直接用图像处理算法(滤波、边缘检测)来处理。但缺点也很明显——它丢失了三维空间的结构信息。你没法从深度图直接知道一个点是在左边还是右边,因为坐标是隐含的。

点云:三维坐标集合

点云就是一堆三维点的集合。每个点包含 (x, y, z) 坐标,有时还带颜色 (r, g, b) 或强度信息。

// 点云数据示例(PLY格式片段)
ply
format ascii 1.0
element vertex 100000
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
end_header
0.123 0.456 1.789 255 0 0
0.234 0.567 1.890 0 255 0
...

点云的优势是:保留了完整的空间信息,可以直接用于三维重建、物体识别、SLAM等。但数据量大——一个百万点的点云,光坐标就占12MB(浮点型)。

我的经验:在嵌入式系统里,我通常先用深度图做快速处理(比如障碍物检测),需要精细建模时才转成点云。深度图转点云其实就是个坐标变换:

x = (u - cx) * z / fx
y = (v - cy) * z / fy
z = depth_value

其中 (u, v) 是像素坐标,(cx, cy) 是光心,(fx, fy) 是焦距。

深度图与点云的转换关系

说白了,深度图是点云的「投影」,点云是深度图的「反投影」。两者可以互相转换,但会损失信息——深度图转点云时,每个像素变成一个三维点;点云转深度图时,多个点可能投影到同一个像素,需要做遮挡处理。

小技巧:如果你需要快速预览点云,可以先把深度图转成伪彩色图显示。我常用 OpenCV 的 applyColorMap 函数,把深度值映射到暖色(近)到冷色(远),一眼就能看出场景结构。

3.4 本章知识体系

下面这张图总结了三种深度感知技术的核心逻辑和输出数据格式的关系。我画这张图的时候,特意把「场景」放在最上面——因为选什么技术,完全取决于你要解决什么问题。

实际场景 双目立体视觉 被动方案·纹理依赖 结构光 主动方案·近距离高精度 ToF 主动方案·远距离抗干扰 深度图 (Depth Map) 16位/32位浮点 · 每个像素存距离值 坐标变换 (内参 + 外参) x = (u-cx)*z/fx, y = (v-cy)*z/fy 点云 (Point Cloud) PLY/PCD格式 · 每个点(x,y,z) + 可选颜色

这张图你看懂了吗?从场景出发,三种技术各有各的活法。但最终,它们都殊途同归——要么输出深度图,要么输出点云。我个人建议初学者先从深度图入手,因为它更直观,调试也方便。等你把深度图玩熟了,点云自然就通了。

本章核心要点:

  • 双目立体视觉靠视差算深度,成本低但怕白墙
  • 结构光精度高但室外不行,ToF室外好但分辨率低
  • 深度图是二维矩阵,点云是三维坐标集合,两者可以互相转换
  • 选型先看场景,再看精度,最后看成本

公众号:蓝海资料掘金营,微信deep3321