4. 深度估计基础:立体匹配原理、视差与深度关系、ToF与结构光原理、点云生成
各位同学,欢迎来到深度估计这一章。说实话,在机器人导航里,深度信息就是机器人的「眼睛」。没有它,机器人就是个睁眼瞎。我最早做AGV小车时,就吃过这个亏——单目相机看着挺清楚,结果一转弯直接撞墙。从那以后,我深刻理解了:没有深度,就没有真正的导航。
这一章,我们聊聊四种主流的深度获取方式。它们各有脾气,也各有绝活。
4.1 立体匹配原理:让两张图「对齐」
立体匹配,说白了就是模仿人眼。左眼看到一点,右眼也看到一点。如果能把这两点对应上,深度就出来了。
但问题来了——怎么找对应点?
我习惯把立体匹配拆成四步走:
- 代价计算:比较左右图像中两个像素块的相似度。越像,代价越小。
- 代价聚合:把局部代价放到全局里看,避免被噪声干扰。
- 视差计算:选代价最小的那个偏移量,就是视差。
- 视差优化:平滑处理,剔除错误匹配。
你可能会问:「为什么不用深度学习?」嗯,深度学习确实准,但实时性是个坎。我在部署到嵌入式平台时,发现传统SGM算法跑得比轻量级CNN还快。所以,别盲目追新,场景决定方案。
核心公式:
视差 d = x_left - x_right
其中 x_left 和 x_right 是同一空间点在左右图像中的列坐标。
我的经验:做立体匹配时,纹理稀疏区域最容易出问题。比如白墙、光滑地面。我建议在这些区域引入一些结构光投影,或者用多帧融合来补全。
4.2 视差与深度关系:一个简单的三角公式
有了视差,深度就呼之欲出了。公式很简单:
Z = (f * B) / d
其中:
- Z:深度(单位:毫米)
- f:相机焦距(单位:像素)
- B:基线长度(单位:毫米)
- d:视差(单位:像素)
你看,深度和视差是反比关系。视差越大,物体越近。这个关系我当年推导了无数遍,但真正让我记住它的,是一次调试经历——我把基线B算错了,结果所有深度都偏了30%。从那以后,我每次标定完都会用已知距离的物体验证一下。
注意:视差是离散的,所以深度也是离散的。距离越远,深度分辨率越低。这就是为什么立体相机在远距离测不准的原因。
4.3 ToF与结构光原理:主动光的两种玩法
立体匹配是被动方案,依赖环境光。但到了暗处,它就歇菜了。这时候,主动光方案就派上用场了。
4.3.1 ToF(飞行时间法)
ToF的原理特别直白:发射一束光,等它反射回来,算时间差。
公式:
深度 = (光速 × 飞行时间) / 2
ToF的优势是速度快,能到30fps甚至更高。我在做室内机器人导航时,就用的ToF传感器。但要注意,多路径干扰是个坑——光线在墙角反射多次,会导致深度偏大。
避坑指南:我曾经在玻璃幕墙前吃过亏。ToF光直接穿透玻璃,打到后面的墙上,返回的深度完全错了。所以,透明物体是ToF的天敌。
4.3.2 结构光
结构光就更有意思了。它投射一个已知图案(比如散斑或条纹),然后看图案被物体表面扭曲成什么样。通过扭曲程度,反推深度。
我最早接触结构光,是用的Kinect v1。那时候觉得这东西太神奇了——投一堆点,就能算出三维形状。但后来发现,室外强光下结构光基本废了。太阳光比投影光强太多,图案根本看不清。
| 特性 | ToF | 结构光 |
|---|---|---|
| 测距范围 | 0.1m - 10m+ | 0.1m - 5m |
| 精度 | 厘米级 | 毫米级 |
| 帧率 | 高(30fps+) | 中(10-30fps) |
| 室外表现 | 较好 | 差 |
| 典型应用 | 导航、避障 | 人脸识别、3D建模 |
4.4 点云生成:从深度图到三维空间
有了深度图,下一步就是生成点云。说白了,就是把每个像素的(u, v, Z)映射到三维空间(X, Y, Z)。
公式:
X = (u - cx) * Z / fx
Y = (v - cy) * Z / fy
Z = Z
其中(cx, cy)是相机光心,(fx, fy)是焦距。
这一步看起来简单,但有个细节要注意——深度图上的无效点。比如ToF的飞点、立体匹配的遮挡区域,这些点的深度值是0或NaN。如果不处理,点云里就会出现一堆「幽灵点」。
我的做法:生成点云前,先做一次深度图滤波。用中值滤波去掉孤立噪点,再用形态学操作填补小空洞。这样生成的点云干净很多。
点云生成后,通常还要做一步——降采样。一个VGA分辨率的深度图,能生成30万个点。这么多点,后续处理太慢了。我一般用体素滤波器,把点云下采样到1-2万个点,既保留结构,又跑得动。
知识体系总览
下面这张图,是我自己整理的深度估计知识框架。你可以把它当作本章的「地图」:
这张图把本章的核心逻辑串起来了。你看,立体匹配和视差深度是一对「被动兄弟」,ToF和结构光是「主动双雄」。它们最终都汇到点云生成这一步。在实际项目中,我经常根据场景混搭使用——白天用立体,晚上用ToF,精细建模用结构光。
好了,深度估计的基础就聊到这儿。下一节我们进入实战,聊聊怎么把这些原理落地到机器人导航系统中。
公众号:蓝海资料掘金营,微信deep3321