深度图生成方法概览

说到深度图生成,我最早接触这个领域是在做3D结构光项目的时候。那时候刚入行,觉得深度图嘛,不就是一张灰白图片嘛。后来踩了不少坑才明白——深度图是计算机视觉里最基础也最核心的数据之一。没有它,三维重建、SLAM、AR这些应用都玩不转。

今天咱们把主流的四种深度图生成方法捋一遍。说白了,就是看看这些方法各自怎么工作的,适合什么场景,有什么坑要注意。

核心观点:没有万能的方法,只有最适合场景的方案。选方法前,先搞清楚你的应用要什么——精度?速度?成本?还是环境适应性?

四种方法速览

我习惯把这四种方法分成两类:主动式被动式。结构光和ToF是自己发射信号去探测,属于主动式。立体匹配和单目深度估计是靠摄像头拍回来的图像算出来的,属于被动式。

下面这张图是我自己画的,把四种方法的核心逻辑串起来了:

深度图生成方法概览 主动式(发射信号) 被动式(图像计算) 结构光 Structured Light 飞行时间法 ToF 立体匹配 Stereo Matching 单目深度估计 Monocular Depth 核心原理 投影已知图案 → 拍摄变形 → 三角测量 发射光脉冲 → 测量飞行时间 → 计算距离 核心原理 双视角图像 → 特征匹配 → 视差计算 单张图像 → 深度学习 → 深度回归 优点 精度高 / 室内效果好 缺点 室外受限 / 成本较高 优点 硬件简单 / 室外可用 缺点 纹理依赖 / 计算量大 典型应用场景 人脸识别 · 工业检测 · AR/VR · 自动驾驶 · 手机摄影

立体匹配(Stereo Matching)

立体匹配的原理其实很直观——模拟人眼。两只眼睛看同一个物体,角度不同,看到的图像位置就有差异。这个差异就是视差,有了视差就能算出深度。

我记得刚做立体匹配那会儿,最头疼的就是纹理缺失的问题。你想想看,一面白墙,左右两张图看起来一模一样,怎么匹配?根本找不到对应点。

我的经验:做立体匹配时,尽量保证场景里有足够的纹理信息。如果场景太单调,可以考虑投影一些随机纹理光斑。我在一个工业检测项目里就这么干过,效果立竿见影。

立体匹配的流程大致分四步:

  1. 代价计算——比较左右图像中像素块的相似度
  2. 代价聚合——把局部信息整合起来,减少噪声
  3. 视差计算——选相似度最高的位置作为匹配点
  4. 视差优化——后处理,去掉错误匹配

常用的算法有SGM(半全局匹配)和基于CNN的端到端方法。SGM在嵌入式设备上跑得动,CNN方法精度更高但需要GPU。

注意:立体匹配对光照很敏感。左右两张图的曝光不一致,匹配质量会直线下降。我曾经在一个户外项目里吃过这个亏,后来加了自动曝光同步才解决。

结构光(Structured Light)

结构光的方法,说白了就是主动投影已知图案,然后用摄像头拍下图案的变形情况,通过三角测量算出深度。

最典型的例子就是微软的Kinect v1。它投影的是红外散斑,摄像头拍到的散斑位置变了,就能算出每个点的深度。

结构光的优势很明显:

  • 精度高,能达到亚毫米级别
  • 不受纹理影响,白墙也能测
  • 计算量相对小

但缺点也很突出:

  • 室外基本不能用——太阳光里的红外成分会淹没投影信号
  • 投影距离有限,远了图案就散了
  • 对反光表面效果差

避坑指南:我曾经做过一个结构光的人脸识别项目,一开始用的散斑投影,结果发现眼镜片反光导致深度图全是空洞。后来换了编码条纹投影,配合多帧融合,才把这个问题解决掉。

飞行时间法(ToF)

ToF的原理更直接——发射光脉冲,测量光往返的时间。光速是已知的,时间测出来了,距离就出来了。

ToF传感器现在在手机上很常见,比如iPhone的LiDAR。它有几个让我特别喜欢的特点:

  • 计算简单,不需要复杂的匹配算法
  • 帧率高,能做实时深度流
  • 距离范围大,几米到几十米都能测

但ToF也有自己的问题。我印象最深的是多路径干扰——光在场景里来回反射,传感器收到的不只是直接反射回来的光,还有二次反射的,这就导致深度值偏大。

方法 精度 范围 帧率 室外可用
立体匹配 中等(mm-cm) 取决于基线 中等 ✅ 可用
结构光 高(亚mm) 0.1-5m ❌ 受限
ToF 中等(cm级) 0.1-50m ✅ 可用
单目深度估计 低-中 无限制 取决于模型 ✅ 可用

单目深度估计(Monocular Depth Estimation)

这个方法最神奇——只用一张图,就能算出深度。听起来像变魔术对吧?其实它靠的是深度学习,从大量数据里学出了"什么物体大概多远"的先验知识。

我刚开始接触单目深度估计时,觉得这东西不靠谱。一张图怎么可能知道深度?后来试了MiDaS和DPT这些模型,发现效果还真不错。尤其是场景里有明显的透视关系时,比如走廊、街道,深度估计的准确度相当高。

但它的局限性也很明显:

  • 尺度模糊——单目深度估计只能给出相对深度,不知道绝对距离
  • 对没见过的东西效果差——训练集里没有的物体,深度估计会乱来
  • 对光照和纹理敏感

我的建议:单目深度估计最适合做辅助信息。比如在SLAM里,它可以帮助初始化地图。或者在AR里,它能让虚拟物体大致放在正确的位置上。但如果你需要高精度的绝对深度,还是老老实实用主动式方法吧。

怎么选?

嗯,说了这么多,到底该用哪种?我个人的经验是:

  • 室内、高精度、短距离 → 结构光
  • 室外、中远距离、实时性要求高 → ToF
  • 硬件成本敏感、有纹理的场景 → 立体匹配
  • 只有单张图、不需要绝对尺度 → 单目深度估计

当然,现在很多方案是融合使用的。比如手机上的深度系统,往往是ToF加双目再加AI,三种方法互补。这也是未来的趋势——没有一种方法能搞定所有场景,但组合起来就能覆盖大部分情况。


专注资料整理