一、双目视觉基础:深度相机原理、双目立体视觉概述、视差与深度关系、标定的意义与目标
1.1 深度相机原理——我们到底在测什么?
做双目视觉这么多年,我经常被问到:“你们这个相机跟普通摄像头有啥区别?”
说白了,普通摄像头只能拍出二维图像——红绿蓝三通道,没有距离信息。而深度相机,就是要在每个像素上多给一个“Z值”,告诉你这个点离镜头有多远。
深度相机的主流方案有三种:
- 结构光法:投射已知图案,通过图案变形算深度。Kinect v1 就是典型代表。
- ToF(飞行时间法):发射光脉冲,测往返时间。手机上的深感镜头大多用这个。
- 双目立体视觉:用两个相机模拟人眼,靠“视差”算深度。这也是咱们这门课的核心。
我个人习惯把双目方案叫做“被动式深度感知”——它不主动发光,全靠环境光。好处是功耗低、室外也能用;坏处是遇到白墙、纹理少的场景就抓瞎。
核心要点:双目深度相机本质上是一对经过精密标定的普通相机,通过几何关系反推深度。它不依赖特殊传感器,成本可控,这也是工业界青睐它的原因。
1.2 双目立体视觉概述——两只眼睛的智慧
你想想看,人为什么有两只眼睛?
一只眼睛也能看东西,但判断距离只能靠经验(比如近大远小)。两只眼睛就不一样了——左右眼看到的画面有细微差异,大脑就是靠这个差异算出距离的。
双目立体视觉,就是把这个过程用数学和算法复现出来。
基本流程是这样的:
- 图像采集:左右相机同时拍一张图
- 立体校正:把两幅图对齐到同一平面上(这一步依赖标定参数)
- 立体匹配:在左图上选一个点,去右图上找它的“孪生兄弟”
- 视差计算:两个点的水平位置差,就是视差
- 深度恢复:用三角测量原理,把视差转成深度
我在项目中遇到过最头疼的事,就是立体匹配这一步。你以为找到了匹配点,其实可能是误匹配。嗯,这里要注意——纹理越丰富,匹配越准;光滑墙面、重复纹理,都是坑。
1.3 视差与深度关系——一个公式搞定
视差和深度的关系,其实就一个公式:
Z = (f * B) / d
其中:
- Z:深度(单位:毫米)
- f:焦距(单位:像素)
- B:基线长度(左右相机光心距离,单位:毫米)
- d:视差(单位:像素)
这个公式告诉我们三件事:
| 变量 | 变化趋势 | 对深度的影响 |
|---|---|---|
| 视差 d 增大 | 物体更近 | Z 变小 |
| 基线 B 增大 | 深度分辨率更高 | 但相机体积变大 |
| 焦距 f 增大 | 视差更敏感 | 但视野变窄 |
我曾经踩过一个坑:选基线时贪大,觉得基线越长精度越高。结果装到机器人上发现,两个相机间距太大,近处的物体根本不在公共视野里。所以基线选择是个权衡——不是越大越好。
避坑指南:我曾经在室外场景用 12cm 基线,结果 10 米外的物体视差只有 1-2 个像素,深度误差直接飙到米级。后来我总结了一个经验——基线长度 ≈ 目标距离的 1/100 到 1/50,效果比较稳。
1.4 标定的意义与目标——为什么非标不可?
你可能会问:相机买回来不就能用吗?为什么要标定?
原因很简单——理想很丰满,现实很骨感。
理论上,左右相机应该完全平行、光轴对齐、焦距一致。但实际生产中:
- 镜头有畸变(径向畸变、切向畸变)
- 两个相机安装有角度偏差
- 焦距、主点位置有微小差异
这些误差如果不校正,算出来的深度就是错的。我见过一个项目,没做标定直接跑立体匹配,结果深度误差超过 30%。
标定的目标,说白了就是三件事:
- 内参标定:知道每个相机的焦距、主点、畸变系数
- 外参标定:知道两个相机之间的旋转和平移关系
- 立体校正:把左右图像“掰正”,让匹配点只出现在同一行上
警告:标定不是一劳永逸的。温度变化、振动、镜头松动都会改变标定参数。我建议每隔 3-6 个月重新标定一次,或者每次拆装后必须重新标。
1.5 本章知识体系
下面这张图,是我自己梳理的双目深度相机标定的知识脉络。你可以把它当作整个课程的地图:
这张图把本章的核心内容串起来了。从深度相机原理出发,到双目立体视觉的完整流程,再到标定的三大任务。后面的章节,就是围绕这张图一步步展开。
一句话总结:双目深度相机标定,就是给两个相机“配对”,让它们知道彼此的位置关系,从而能从二维图像中算出三维深度。没有标定,双目系统就是一对瞎眼。
公众号:蓝海资料掘金营,微信deep3321