深度相机基础:从原理到选型,我踩过的那些坑
大家好,我是你们的老朋友。今天咱们聊聊深度相机。说实话,我刚入行那会儿,觉得深度相机就是个能测距离的摄像头,没啥了不起的。直到第一次做AR项目,被深度图对齐搞得焦头烂额,才明白这里面的门道有多深。
这一章,我会从原理讲到选型,把我在项目中积累的经验和教训都抖出来。你想想看,搞AR交互,深度相机就是你的「眼睛」。眼睛不好使,后面的算法再牛也白搭。
核心要点:深度相机的本质是「测距」,但不同技术路线的测距方式、精度、适用场景天差地别。选错相机,项目直接凉一半。
一、三种主流深度相机工作原理
目前市面上主流的深度相机,说白了就三种:ToF、结构光、双目立体视觉。我一个个讲,顺便说说我踩过的坑。
1. ToF(飞行时间法)
ToF的原理很简单——发射光脉冲,测量光往返的时间,算出距离。就像蝙蝠用回声定位一样。
我个人的习惯是:在需要高帧率的动态场景,优先考虑ToF。比如手势识别、人体追踪,ToF的实时性确实好。
- 优点:帧率高(30-60fps)、远距离(可达10米以上)、受环境光影响小
- 缺点:分辨率低(通常VGA级别)、边缘精度差、多机干扰
避坑指南:我曾经在户外AR项目里用ToF,结果大太阳底下直接「瞎了」。后来才知道,强红外光会淹没ToF的信号。室内用ToF很香,室外慎选。
2. 结构光
结构光投影出已知图案(比如散斑、条纹),通过图案的变形来计算深度。说白了,就是「看影子猜形状」。
我记得第一次用Kinect v1时,被它的深度精度惊艳到了。近距离(0.5-3米)下,结构光的精度可以到毫米级。
- 优点:近距离精度高、分辨率高(可达1080p)、成本低
- 缺点:受环境光影响大、有效距离短(通常<5米)、需要投影仪
注意:结构光在室外基本不能用。太阳光里的红外成分会干扰投影图案。我有个朋友非要在户外用结构光做AR导航,结果深度图全是噪点,项目直接延期两周。
3. 双目立体视觉
双目模拟人眼,用两个摄像头拍摄同一场景,通过视差计算深度。原理不复杂,但计算量不小。
你想想看,两个图像找对应点,这本身就是个难题。纹理少的墙面、重复图案的地板,双目基本就废了。
- 优点:成本低(只需两个普通摄像头)、室外可用、无主动光源
- 缺点:计算量大、弱纹理区域失效、基线长度限制精度
我的经验:双目适合室外大场景,比如AR导航、SLAM建图。但别指望它在白墙上能测出深度——我试过,结果全是黑洞。
二、深度图与RGB图对齐
这是AR交互里最让人头疼的问题之一。深度相机输出的深度图,和RGB相机拍到的彩色图,往往不在同一个坐标系里。不对齐,你没法知道「这个像素的深度是多少」。
为什么会这样?因为深度传感器和RGB传感器物理位置不同,视角有偏差。就像你的左眼和右眼看东西有视差一样。
对齐的核心思路:通过标定得到两个相机之间的外参(旋转R和平移T),然后做重投影。
// 伪代码:深度图对齐到RGB图
for each pixel (u_d, v_d) in depth_image:
// 1. 将深度像素反投影到3D空间
P_d = depth_to_pointcloud(u_d, v_d, depth_value)
// 2. 通过外参变换到RGB相机坐标系
P_rgb = R * P_d + T
// 3. 投影到RGB图像平面
(u_rgb, v_rgb) = project(P_rgb, rgb_intrinsics)
// 4. 赋值:RGB图像(u_rgb, v_rgb)处的颜色 = 深度图像(u_d, v_d)处的深度值
避坑指南:我曾经直接用OpenCV的stereoRectify做对齐,结果发现深度图和RGB图边缘总有错位。后来才意识到,两个相机的畸变参数没校准。记住:先做单目标定,再做双目标定,顺序不能乱。
对齐后的深度图,每个像素都对应RGB图的同一个位置。这样你才能做「点击屏幕获取深度」或者「根据深度做遮挡」这类AR交互。
三、深度相机选型指南
选型这事儿,我吃过不少亏。刚开始做项目时,我总想着「参数越高越好」,结果买回来发现根本用不上。你想想看,做手势识别需要高帧率,做三维重建需要高精度,做SLAM需要宽视场角——没有一款相机能通吃所有场景。
下面这张表,是我根据项目经验整理的选型参考:
| 应用场景 | 推荐技术 | 推荐型号 | 关键参数 |
|---|---|---|---|
| 手势识别(室内) | ToF | Intel RealSense L515 | 帧率≥30fps,距离0.5-3m |
| 人脸建模 | 结构光 | Kinect v1 / Orbbec Astra | 精度≤1mm,距离0.5-2m |
| AR导航(室外) | 双目 | ZED 2 / Intel RealSense D455 | 视场角≥90°,距离≥10m |
| SLAM建图 | 双目+IMU | Intel RealSense T265 | IMU频率≥200Hz,双目基线≥6cm |
| 工业检测 | ToF/结构光 | Basler ToF / Keyence | 精度≤0.5mm,帧率≥60fps |
选型三原则:
- 先定场景,再定参数。别被厂商的营销话术带偏了。
- 实测为王。参数表再好看,不如拿回来跑一遍你的算法。
- 考虑生态。SDK好不好用?社区活跃吗?有没有现成的ROS驱动?这些比参数更重要。
我个人习惯是,先列一个「必须满足」的参数清单,比如最小深度距离、帧率、接口类型。然后在这个清单里挑性价比最高的。别贪多,够用就行。
四、知识体系总览
下面这张图,是我自己画的深度相机知识体系。你一看就明白各模块之间的关系了。
这张图把深度相机的技术路线、核心处理、应用场景和选型逻辑串起来了。你保存下来,以后做项目决策时拿出来看看,能少走不少弯路。
好了,第一章就到这里。深度相机这块,原理是基础,对齐是门槛,选型是艺术。我当年也是从「买最贵的」到「买最对的」,一步步试出来的。你如果刚开始接触,别急,慢慢来。
有什么问题,欢迎交流。咱们下一章见。