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 知识体系结构图
下面这张图,是我自己总结的深度数据基础结构。你把它记在脑子里,后面学起来会轻松很多。
这张图把深度数据的基础结构串起来了。你从深度图出发,左边是深度值单位,右边是坐标系,下面是点云。每个分支都对应着实际开发中必须注意的细节。
3.5 总结
深度图与点云的关系,说白了就是「一张图」和「一堆点」的互相转换。深度值单位搞错了,点云就飞了;坐标系搞反了,地图就歪了。可视化方法选对了,调试效率翻倍。
我个人建议,每次拿到新的深度相机,第一件事就是:确认深度值单位,确认坐标系定义,然后做一次深度图到点云的转换验证。这一步花不了10分钟,但能帮你省下后面几天的排查时间。
好了,深度数据基础就讲到这里。下一节我们会深入深度相机的标定与校准,到时候再聊。