3. 深度数据基础:深度图与点云的关系、深度值单位与坐标系、深度图可视化方法

各位同学,欢迎来到深度相机课程的核心基础章节。说实话,很多做SLAM的朋友,算法调得飞起,但最后定位精度上不去,回头一查,往往是深度数据本身就有问题。今天我们就来把深度数据的几个基本概念彻底理清楚。

3.1 深度图与点云:一对孪生兄弟

深度图和点云,说白了就是同一份数据的不同表现形式。我习惯把深度图看作是「带距离值的照片」,而点云则是「三维空间的散点集合」。

深度图:一张灰度图,每个像素的值代表该点到相机的距离。像素坐标(u, v) + 深度值d,就构成了一个三维空间点的线索。

点云:一堆三维坐标点(x, y, z)的集合。每个点都明确知道自己在哪里。

它们之间的转换关系,其实就是一个相机内参矩阵的事。我当年刚入行时,总觉得这俩是不同东西,后来才明白——深度图是点云的「投影」,点云是深度图的「反投影」

核心公式(反投影):

给定深度图上一点 (u, v),深度值为 d,相机内参为 fx, fy, cx, cy,则对应的三维点坐标为:

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

反过来,点云投影到深度图就是正向投影,公式反过来用就行。

嗯,这里要注意:深度图上的每个像素,不一定都能对应到点云。为什么?因为深度相机有盲区、有无效像素(比如黑色吸光物体、镜面反射区域)。我在项目中遇到过,一个黑色塑料件放在桌上,深度图直接就是黑洞,点云里缺了一大块。这种坑,你早晚会踩到。

3.2 深度值单位与坐标系:最容易翻车的两个细节

讲真,深度值单位这个问题,我见过太多人翻车了。不同厂家、不同型号的深度相机,深度值的单位可能完全不同。

相机类型 常见深度值单位 典型范围
Intel RealSense D435 毫米 (mm) 0.1m ~ 10m
Microsoft Kinect v2 毫米 (mm) 0.5m ~ 4.5m
Apple LiDAR (iPad Pro) 米 (m) 0.3m ~ 5m
ZED 双目相机 米 (m) 0.5m ~ 20m
TOF 相机 (如 PMD) 毫米 (mm) 0.1m ~ 8m

避坑指南:我曾经在项目里直接用RealSense的深度值去算点云,结果点云全飞到天上了。查了半天,才发现RealSense的深度值单位是毫米,而我代码里默认当成了米。一个简单的单位换算,浪费了我整整一个下午。

再说坐标系。深度相机通常有自己独立的坐标系,但SLAM系统里我们一般用相机坐标系(Camera Coordinate System)。

  • 相机坐标系:原点在相机光心,Z轴指向相机前方,X轴向右,Y轴向下(OpenCV惯例)。
  • 深度图坐标系:原点在图像左上角,u轴向右,v轴向下。

你想想看,深度图上的一个像素 (u, v),要转换到相机坐标系下的 (x, y, z),中间必须经过内参矩阵。这个转换如果搞反了,点云就会左右颠倒或者上下颠倒。

⚠️ 重要提醒: 不同SLAM框架(如ORB-SLAM、VINS、LIO-SAM)对坐标系的定义可能不同。有的用右手系,有的用左手系。接入深度数据前,务必确认坐标系定义是否一致。我见过一个团队,因为坐标系方向没对齐,融合后的地图直接扭曲成了麻花。

3.3 深度图可视化方法:别只用眼睛看

深度图可视化,听起来简单,但做不好会误导你。我常用的方法有几种,各有优劣。

方法一:直接灰度显示

把深度值映射到0-255的灰度范围。简单粗暴,但近处物体亮、远处物体暗。问题是,如果场景深度范围很大,近处细节全白,远处细节全黑,啥也看不清。

方法二:伪彩色映射(推荐)

把深度值映射到彩色空间,比如近处用红色,远处用蓝色。这样视觉上更直观,细节也更丰富。OpenCV里用 applyColorMap 就能搞定。

import cv2
import numpy as np

# 假设 depth_img 是深度图,单位毫米
# 先归一化到0-255
depth_norm = cv2.normalize(depth_img, None, 0, 255, cv2.NORM_MINMAX)
depth_norm = depth_norm.astype(np.uint8)

# 伪彩色映射
depth_color = cv2.applyColorMap(depth_norm, cv2.COLORMAP_JET)

cv2.imshow('Depth Color', depth_color)
cv2.waitKey(0)

方法三:点云可视化

把深度图转成点云,然后用PCL或Open3D显示。这是最直观的方式,能看到三维结构。但要注意,点云可视化对性能要求高,实时SLAM里一般只用来调试。

💡 我的个人习惯: 调试阶段,我会同时显示三样东西——原始深度图(灰度)、伪彩色深度图、以及稀疏点云。灰度图看整体趋势,伪彩色图看细节,点云看三维结构。三管齐下,基本不会漏掉问题。

3.4 知识体系结构图

下面这张图,是我自己总结的深度数据基础结构。你把它记在脑子里,后面学起来会轻松很多。

深度数据基础结构 深度图 深度值单位 毫米 (mm) 米 (m) 坐标系 相机坐标系 图像坐标系 世界坐标系 点云 反投影(深度图→点云) 投影(点云→深度图) 可视化方法:灰度 / 伪彩色 / 点云

这张图把深度数据的基础结构串起来了。你从深度图出发,左边是深度值单位,右边是坐标系,下面是点云。每个分支都对应着实际开发中必须注意的细节。

3.5 总结

深度图与点云的关系,说白了就是「一张图」和「一堆点」的互相转换。深度值单位搞错了,点云就飞了;坐标系搞反了,地图就歪了。可视化方法选对了,调试效率翻倍。

我个人建议,每次拿到新的深度相机,第一件事就是:确认深度值单位,确认坐标系定义,然后做一次深度图到点云的转换验证。这一步花不了10分钟,但能帮你省下后面几天的排查时间。

好了,深度数据基础就讲到这里。下一节我们会深入深度相机的标定与校准,到时候再聊。


专注资料整理