深度相机模组的输出、算法与深度图格式

深度相机模组不是输出 "混合后的图像",而是同时输出多路独立数据流(彩色图、深度图、红外图、点云等)。所谓 "混合" 其实是深度图与彩色图的配准对齐,或者是左右目图像经过立体匹配算法算出深度图。下面拆开讲。


一、深度相机模组输出什么

深度相机模组(如 Intel Realsense、Azure Kinect、ZED、奥比中光)通常同时输出以下多路数据,用户可以按需取:

表格

输出流 数据类型 说明
彩色图像 (Color) H×W×3 RGB 普通摄像头画面,和单目相机输出一样
深度图 (Depth) H×W 单通道 每个像素值 = 该点到相机的距离,这是核心输出
红外图像 (IR) H×W 灰度 结构光 / 双目模组的左右红外摄像头原始画面,用于调试
点云 (PointCloud) N×(X,Y,Z,R,G,B) 可选输出,把深度图 + 彩色图直接转成 3D 点云,有些模组固件直接输出
置信度图 (Confidence) H×W 单通道 每个像素深度值的可信度,0 = 不可靠,用于过滤坏点
IMU 数据 加速度 + 角速度 部分模组 内置 IMU,用于运动补偿

关键:这些数据流是独立的,可以单独取,也可以组合取。 不是 "混成一张图" 输出。


二、深度是怎么算出来的:三类技术路线的算法

深度相机模组内部有一颗专用芯片(ASIC/FPGA/SoC),实时运行深度计算算法。不同技术路线,算法完全不同:

路线 1:双目立体视觉深度相机

代表:ZED、Realsense D435/D455(部分模式)

算法流程

plaintext

左目红外图像 ─┐
              ├→ 立体匹配算法(SGBM/AD-Census等) → 视差图 → Z=f×B/d → 深度图
右目红外图像 ─┘
  • 左右两个红外摄像头同时拍照;
  • 内置芯片跑立体匹配算法(和之前问的双目测距原理一样);
  • 算出视差 → 三角公式算深度;
  • 输出深度图。

这种模组的 "深度算法" 就是立体匹配,和 PC 端纯双目方案用的算法一样,只是跑在相机内部芯片上。

路线 2:结构光深度相机

代表:iPhone FaceID、Realsense D415、旧版 Kinect v1、奥比中光

算法流程

plaintext

红外投射器 → 向空间投射固定编码图案(激光散斑/条纹)
                    ↓
红外摄像头 → 拍摄被物体调制后的变形图案
                    ↓
          图案解码算法 → 每个像素的视差 → 三角测距 → 深度图
  • 主动投射一个已知编码红外图案(比如随机散斑、格雷码条纹);
  • 图案打在物体上会变形,红外摄像头拍下来;
  • 算法对比 "原始图案" 和 "变形后图案",算出每个点的视差;
  • 再用三角公式算深度。

结构光的优势:解决了双目 "无纹理区域匹配失败" 的问题—— 白墙也能被投射上图案,有纹理就能匹配。

路线 3:ToF 深度相机

代表:Kinect v2、Azure Kinect、Realsense L515

算法流程

plaintext

红外LED/激光器 → 发射调制光(正弦波/脉冲)
                      ↓
物体反射 → ToF传感器接收
                      ↓
            相位差/飞行时间测量 → 深度图
  • 主动发射调制红外光;
  • 传感器测量发射光和接收光的相位差(间接 ToF)或飞行时间(直接 ToF);
  • 相位差 → 距离,直接算出每个像素的深度。

ToF 不需要立体匹配,每个像素独立测距,原理和激光雷达类似,只是面阵化了。


三、"混合" 到底是什么:深度图与彩色图配准

用户说的 "混合图像",通常指的是深度图和彩色图对齐(Registration/Alignment)

为什么需要配准

  • 深度摄像头和彩色摄像头不是同一个镜头,位置不同(有基线);
  • 深度图的像素坐标系和彩色图的像素坐标系不一致
  • 同一个物体,在深度图里的 (x,y) 和在彩色图里的 (x,y) 不是同一个物理点。

配准算法

plaintext

深度图的每个像素 (u_d, v_d, Z)
    ↓ 用深度相机内参 → 3D坐标 (X,Y,Z)
    ↓ 用深度相机→彩色相机的外参(旋转R+平移T) → 彩色相机坐标系下的3D坐标
    ↓ 用彩色相机内参 → 彩色图像素坐标 (u_c, v_c)
    ↓
把深度值Z赋值给彩色图的 (u_c, v_c) 像素
    ↓
输出:和彩色图对齐的深度图(分辨率、坐标系与彩色图一致)
  • 这是一个坐标变换过程,不是图像融合;
  • 配准后,深度图和彩色图逐像素一一对应,可以直接合成 RGBD 图像(每个像素 = R,G,B,Depth);
  • 大部分深度相机 SDK(如 Realsense 的align_to)一键完成配准。

通俗理解:深度摄像头和彩色摄像头是 "两只位置不同的眼睛",配准就是把两只眼睛看到的东西对齐到同一个视角,让 "深度值" 和 "颜色值" 对应到同一个物体点。


四、深度图的格式(重点)

1. 数据类型与单位

表格

格式 数据类型 单位 无效值 典型代表
uint16 深度图 16 位无符号整数 毫米 (mm) 0 Realsense、OpenNI、大多数 SDK
float32 深度图 32 位浮点数 米 (m) 0.0 或 NaN PCL 点云库、部分研究代码
uint8 归一化 8 位无符号整数 0~255 映射 0 仅用于可视化,不是真实深度

最常用的是 uint16 + 毫米单位

  • 像素值 = 1000 → 距离 1000mm = 1m;
  • 像素值 = 0 → 该像素深度无效(匹配失败 / 超出量程 / 被遮挡);
  • 最大量程通常 10000mm(10m)以内,uint16 足够(最大 65535mm=65m)。

2. OpenCV 中的格式

cpp

运行

// 深度图在OpenCV中通常是
CV_16UC1  // 16位无符号,单通道,单位毫米
// 或
CV_32FC1  // 32位浮点,单通道,单位米

3. 点云格式

深度图可以直接转成点云:

plaintext

对每个像素 (u, v),深度值 Z:
X = (u - cx) × Z / fx
Y = (v - cy) × Z / fy
Z = Z

输出 N×6 的数组:每个点 = (X, Y, Z, R, G, B),即带颜色的 3D 点云。

常见存储格式:.pcd(PCL 库)、.ply(通用三维格式)、.bag(ROS 录制包)。

4. 深度图可视化

  • 深度图本身是 16 位单通道,直接显示是几乎全黑(因为值都在 0~ 几千,显示范围 0~255);
  • 可视化时需要伪彩色映射:把深度值映射成彩虹色(近 = 红 / 黄,远 = 蓝 / 紫);
  • OpenCV 的applyColorMap或 Realsense SDK 自带彩色化功能。

五、一张表总结三类深度相机

表格

维度 双目立体视觉 结构光 ToF
代表 ZED、Realsense D435 FaceID、D415、Kinect v1 Kinect v2、L515
深度算法 立体匹配 图案解码 + 三角测距 相位 / 时间测量
主动发光 否(被动) 是(红外图案) 是(调制红外光)
无纹理区域 失效(白墙) 有效(投射图案) 有效
有效距离 0.3~20m 0.3~5m 0.3~10m
深度图分辨率 最高(和红外一致) 中(受 ToF 传感器限制)
室外阳光 较好(但依赖光照) 差(阳光淹没图案) 差(阳光干扰)
输出 深度图 + 左右 IR + 彩色 深度图 + IR + 彩色 深度图 + IR + 彩色

六、一句话总结

深度相机模组输出多路独立数据流(彩色图、深度图、红外图、可选点云),不是 "混合图像"。深度由相机内部芯片运行算法算出 —— 双目路线用立体匹配、结构光路线用图案解码 + 三角测距、ToF 路线用相位 / 时间测量。深度图最常用 uint16 单通道格式,单位毫米,0 表示无效值。所谓 "混合" 是深度图与彩色图的配准对齐,让深度值和颜色值逐像素对应,方便合成 RGBD 数据或点云。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐