4. 深度估计基础:立体匹配原理、视差与深度关系、ToF与结构光原理、点云生成

各位同学,欢迎来到深度估计这一章。说实话,在机器人导航里,深度信息就是机器人的「眼睛」。没有它,机器人就是个睁眼瞎。我最早做AGV小车时,就吃过这个亏——单目相机看着挺清楚,结果一转弯直接撞墙。从那以后,我深刻理解了:没有深度,就没有真正的导航

这一章,我们聊聊四种主流的深度获取方式。它们各有脾气,也各有绝活。

4.1 立体匹配原理:让两张图「对齐」

立体匹配,说白了就是模仿人眼。左眼看到一点,右眼也看到一点。如果能把这两点对应上,深度就出来了。

但问题来了——怎么找对应点?

我习惯把立体匹配拆成四步走:

  1. 代价计算:比较左右图像中两个像素块的相似度。越像,代价越小。
  2. 代价聚合:把局部代价放到全局里看,避免被噪声干扰。
  3. 视差计算:选代价最小的那个偏移量,就是视差。
  4. 视差优化:平滑处理,剔除错误匹配。

你可能会问:「为什么不用深度学习?」嗯,深度学习确实准,但实时性是个坎。我在部署到嵌入式平台时,发现传统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原理 结构光原理 代价计算 代价聚合 视差计算 视差优化 Z = (f * B) / d 反比关系 深度分辨率递减 飞行时间测距 高帧率 多路径干扰 图案投影 高精度 室外受限 点云生成 深度图 → 三维坐标映射 → 滤波 → 降采样

这张图把本章的核心逻辑串起来了。你看,立体匹配和视差深度是一对「被动兄弟」,ToF和结构光是「主动双雄」。它们最终都汇到点云生成这一步。在实际项目中,我经常根据场景混搭使用——白天用立体,晚上用ToF,精细建模用结构光。

好了,深度估计的基础就聊到这儿。下一节我们进入实战,聊聊怎么把这些原理落地到机器人导航系统中。


公众号:蓝海资料掘金营,微信deep3321