一、红外结构光基础:从物理原理到工程实践
做3D视觉这些年,我接触过不少深度感知方案。说实话,红外结构光是我个人最偏爱的一种。为什么?因为它能在室内场景下给你非常稳定的深度数据,而且成本可控。今天我们就从最基础的东西聊起。
1.1 红外光的特性——为什么选它?
先问一个问题:为什么结构光要用红外光,而不是可见光?
原因其实很直接。红外光波长在780nm-1mm之间,人眼看不见。这意味着什么呢?你想想看,如果我用一个可见光投影仪往你脸上打条纹,你肯定觉得刺眼。但红外光不会,它不影响你正常使用设备。
我在做第一代结构光产品时,就踩过这个坑。当时为了省成本,用了近红外LED,波长850nm。结果发现环境光中的红外成分干扰特别大,尤其是阳光直射场景,信噪比直接崩了。后来换成了940nm的VCSEL激光器,效果明显改善。
红外光的关键参数:
- 波长:常用850nm或940nm
- 940nm优势:环境光干扰小,人眼安全阈值高
- 850nm优势:传感器量子效率更高
我的经验:如果你做消费级产品,优先选940nm。虽然传感器响应稍弱,但抗干扰能力带来的收益更大。工业场景如果环境光可控,850nm性价比更高。
1.2 结构光编码原理——散斑与条纹
结构光的核心思想很简单:我发射已知图案的光,然后用相机拍下被物体调制后的图案,通过图案的变形来反推深度。说白了,就是「我告诉你我发了什么,你看收到的是什么,差值就是深度信息」。
1.2.1 散斑结构光
散斑结构光,我习惯叫它「随机点阵」。它投射的是随机分布的斑点图案。每个斑点周围的小区域都是独一无二的——就像指纹一样。
工作原理是这样的:
- 投影器发射已知的散斑图案
- 相机拍摄被物体调制后的散斑
- 通过块匹配算法,找到参考图像中对应的块
- 视差 = 参考位置 - 当前位置
- 深度 = 根据三角测距公式计算
Kinect v1用的就是散斑结构光。我记得当时拆解它的时候,发现它的散斑图案是经过特殊设计的,不是纯随机,而是有编码规律的。这样做的好处是匹配更鲁棒。
避坑指南:我曾经在项目里直接用随机数生成散斑图案,结果匹配成功率只有60%左右。后来改用de Bruijn序列编码,匹配率提升到了95%以上。散斑不是越随机越好,要有编码约束。
1.2.2 条纹结构光
条纹结构光用的是正弦条纹或二值条纹。最常见的是相移法:投射多幅不同相位的条纹图,通过解相位得到深度。
相移法的核心公式:
I(x,y) = A(x,y) + B(x,y) * cos(φ(x,y) + δ)
其中:
I: 采集到的光强
A: 背景光强
B: 调制幅度
φ: 待求相位
δ: 已知相移量
通过至少三幅不同相移的条纹图,可以解出相位φ。相位再通过三角测距换算成深度。
条纹法的优势是精度高,亚像素级别。但缺点是需要多幅投影,不适合动态场景。我做高精度工业检测时常用四步相移法,精度能做到0.01mm级别。
| 方法 | 精度 | 速度 | 适用场景 |
|---|---|---|---|
| 散斑结构光 | 毫米级 | 单帧 | 人脸识别、体感交互 |
| 条纹结构光 | 亚毫米级 | 多帧 | 工业检测、逆向工程 |
1.3 主动深度感知 vs 被动视觉
这个区别其实很本质。被动视觉就是「只看不照」,靠环境光成像。主动深度感知是「又照又看」,自己发射能量。
被动视觉的典型代表是双目立体视觉。它依赖两个相机拍摄的图像的纹理匹配来估计深度。问题在于:如果物体表面是白墙、光滑表面,没有纹理,双目就失效了。
我做过一个项目,用双目做仓储机器人导航。仓库里全是白色货架,双目算法直接崩溃,匹配点几乎为零。后来换成红外结构光,白墙也能打出纹理,问题迎刃而解。
核心区别总结:
- 被动视觉:依赖环境纹理,弱纹理场景失效,功耗低,室外可用
- 主动深度感知:自己创造纹理,弱纹理场景也能工作,功耗高,室外受环境光影响
你想想看,为什么iPhone的Face ID要用结构光而不是双目?就是因为人脸在弱光环境下纹理不足,双目根本没法用。结构光主动投射散斑,不管环境多暗都能工作。
1.4 知识体系框架
下面这张图是我自己整理的,把红外结构光的基础知识串起来了。你看一遍应该能有个整体印象。
这张图把红外结构光的基础分成了三个层次:底层是红外光的物理特性,中间是编码方法,上层是深度计算。主动和被动两种方式的对比放在底部,方便你理解它们的本质区别。
一点建议:初学者容易陷入「哪种方法更好」的争论。我的看法是:没有最好的方法,只有最合适的场景。做产品选型时,先想清楚你的使用场景,再决定用主动还是被动。
好了,红外结构光的基础就聊到这里。这些概念是后面所有内容的地基,务必理解透彻。下一章我们会深入散斑结构光的工程实现细节,包括投影器选型、标定方法、以及我踩过的那些坑。
公众号:蓝海资料掘金营,微信deep3321