2、核心深度技术原理(上):双目立体视觉原理、结构光原理(散斑与编码光)、ToF(飞行时间)原理
各位同学,欢迎来到深度相机选型的核心章节。
说实话,市面上那么多深度相机,原理无非就那三大类:双目、结构光、ToF。你搞懂了它们,选型就成功了一半。今天咱们就把这三兄弟的底裤扒干净。
核心观点:没有完美的深度技术,只有最适合场景的方案。双目像人的眼睛,结构光像投影仪+相机,ToF像声呐。理解它们的物理本质,比背参数更重要。
2.1 双目立体视觉:最像人眼的技术
双目立体视觉,说白了就是模仿人的双眼。你想想看,为什么你能判断远处那杯咖啡离你有多远?因为你的左眼和右眼看到的画面有细微差别,大脑通过这个差别算出了距离。
相机也是一样。两个摄像头,左右放置,同时拍一张照片。然后算法去找左图里的某个像素点,在右图里对应哪个位置。这个位置的偏移量,我们叫「视差」。视差越大,物体越近;视差越小,物体越远。
我的经验:做双目系统,最头疼的不是算法,而是标定。我曾在项目里花了两周时间调相机的外参,结果发现是镜头畸变参数没给对。记住:标定板一定要用陶瓷的,纸质的受潮会变形,标出来全是错的。
数学上,深度 Z 和视差 d 的关系很简单:
Z = (f * B) / d
其中:
Z = 深度值(单位:mm)
f = 焦距(单位:pixel)
B = 基线长度(两个相机光心的距离,单位:mm)
d = 视差(单位:pixel)
这个公式告诉我们两件事:
- 基线越长,测距越远。 但基线太长,近处物体就出画了。这是个 trade-off。
- 视差精度决定深度精度。 亚像素匹配能做到 0.1 pixel 的精度,但需要好的纹理。
立体匹配的三大流派
立体匹配是双目系统的灵魂。我把它分成三类:
| 流派 | 代表算法 | 速度 | 精度 | 适用场景 |
|---|---|---|---|---|
| 局部匹配 | BM、SAD、NCC | 快(实时) | 中等 | 纹理丰富的场景 |
| 全局匹配 | GC、Graph Cut | 慢(离线) | 高 | 弱纹理、重复纹理 |
| 半全局匹配 | SGM、SGBM | 较快 | 较高 | 工业、自动驾驶 |
避坑指南:我曾经在室内白墙场景用双目,结果深度图全是黑洞。为什么?因为白墙没有纹理,左右相机看到的完全一样,匹配算法直接罢工。后来我加了个投影仪打纹理,才解决问题。记住:双目天生怕弱纹理。
2.2 结构光原理:主动投射的「作弊器」
结构光,说白了就是「我主动给你打上标记,然后我来认」。双目是被动地等自然光,结构光则是主动投射已知图案,然后相机拍下被物体表面调制后的图案,通过图案的变形来算深度。
这里有两个主流分支:
散斑结构光
投射器打出密密麻麻的随机光斑(像星空一样)。每个光斑的局部图案都是独一无二的。相机拍下后,算法通过识别这些光斑的偏移量来计算深度。
代表产品:微软 Kinect v1、苹果 Face ID。
我的感受:散斑结构光在室内效果极好,但一到室外,太阳光里的红外成分会把散斑淹没。我试过在正午阳光下用 Kinect v1,深度图直接废了。所以它天生是室内选手。
编码结构光
投射的不是随机散斑,而是有规律的编码图案。比如格雷码、相移条纹。通过多帧图案的时序变化,逐像素解码出深度。
优势:精度极高,可以达到亚毫米级。
劣势:需要投射多帧图案,所以只能拍静态物体。动起来就糊了。
关键区别:散斑结构光用「空间唯一性」来编码(一帧搞定),编码结构光用「时间序列」来编码(多帧搞定)。前者适合动态,后者适合高精度静态。
2.3 ToF(飞行时间):直接测光速
ToF 的原理最暴力——直接测量光从发射到返回的时间。光速是已知的(3×10⁸ m/s),时间乘以光速再除以2,就是距离。
但光速太快了,1米的距离,光只需要 3.3 纳秒。普通电子设备根本测不了这么短的时间。所以 ToF 分成了两派:
iToF(间接飞行时间)
不直接测时间,而是测相位差。发射连续调制的红外光,接收到的光会有相位延迟,通过相位差反推距离。
- 优点:芯片工艺成熟,成本低,分辨率可以做到 VGA 甚至更高。
- 缺点:存在「距离模糊」问题——相位差每 2π 循环一次,超过量程就会混淆。
dToF(直接飞行时间)
直接测单个光脉冲的往返时间。用 SPAD(单光子雪崩二极管)来捕捉单个光子。
- 优点:没有距离模糊,测距远(几十米甚至上百米),抗环境光强。
- 缺点:分辨率低(目前主流是 QVGA),成本高。
我的建议:如果你做手机或者消费级产品,iToF 更合适,因为分辨率高、成本可控。如果你做车载激光雷达或者工业测距,dToF 是唯一选择。我去年帮客户选型,他们要做扫地机避障,我推荐了 iToF,效果很好,因为扫地机只需要 5 米内的深度信息。
2.4 三大技术对比总结
| 维度 | 双目立体视觉 | 结构光 | ToF |
|---|---|---|---|
| 主动光源 | 不需要 | 需要(红外激光) | 需要(红外激光/LED) |
| 室外表现 | 优秀(依赖自然光) | 差(太阳光干扰) | 良好(dToF 更优) |
| 弱纹理表现 | 差 | 优秀 | 优秀 |
| 精度 | 中等(随距离下降) | 高(近距离) | 中等(随距离下降) |
| 帧率 | 30-60fps | 30fps(散斑)/ 1-10fps(编码) | 30-120fps |
| 功耗 | 低(纯计算) | 中等 | 高(激光发射) |
| 典型距离 | 0.5m - 50m | 0.1m - 5m | 0.1m - 30m |
| 代表产品 | ZED、Intel T265 | Kinect v1、Face ID | Kinect v2、iPhone X 后置 |
最后提醒一句:别只看参数表。我见过太多人拿着参数表对比,最后选了个「理论上最好」的相机,结果现场一测,根本不能用。为什么?因为参数表里的精度是在实验室理想条件下测的。你实际场景里的光照、纹理、反射率,都会让性能打折扣。所以,一定要拿样机去你的实际场景里测,测完再决定。
公众号:蓝海资料掘金营,微信deep3321