Stereo Vision
立体视觉(stereo vision)利用两个由已知基线(baseline) 分隔的已标定相机来恢复深度。由于两个相机之间的相对位姿是固定且已知的,场景中某一点在其中一幅图像中的位置就约束了它在另一幅图像中可能出现的位置,两次观测之间的水平位移编码了度量深度。
视差与深度
经过**校正(rectification,将两幅图像变形,使其对极线成为同一条水平扫描线)**之后,一个深度为 的三维点在左、右图像中分别出现在水平像素坐标 和 处。**视差(disparity)**为
其中 是以像素为单位的焦距。对其求逆即可恢复深度:
给定 ,完整的三维点可以由针孔模型得到:,。
深度不确定性
对 求导,可以看出匹配误差 (通常为一个像素的一小部分)如何传播到深度上:
深度误差随距离呈平方增长,并与基线成反比。这是双目相机装置的基本设计权衡:更宽的基线能提升远景精度,但会缩小重叠视场,并使近距离匹配更加困难;较窄的基线则恰恰相反。超过某个范围之后,视差会低于匹配精度,双目相机对实质上就退化为单目相机。
立体匹配
要生成一幅稠密的视差图(disparity map),需要为左图中的每个像素在右图中沿同一扫描线找到其对应点:
- 局部(块)匹配使用诸如 SAD(绝对差之和)、NCC(归一化交叉相关)或 census 变换等代价函数比较小窗口。速度快,但在无纹理和重复区域会失效。
- **半全局匹配(Semi-global matching, SGM)**加入了平滑先验:它最小化的代价函数把逐像素的数据项与惩罚项 (小的视差变化)和 (大的跳变)相结合,并沿图像中多条一维路径进行聚合。SGM 是实时稠密立体视觉的主力算法,也是大多数立体深度传感器在硬件或 GPU 上运行的算法。
- 一致性检查(左右一致性检验、唯一性检验、斑点滤波)用于剔除不可靠的视差。
稀疏立体匹配——只在两幅视图之间匹配检测到的关键点——在基于特征的SLAM中很常见(例如 ORB-SLAM2 的双目模式),因为它避免了稠密匹配的开销,同时仍能提供度量地图点。
双目、单目与 RGB-D 的比较
立体视觉本质上是使用固定的、出厂标定好的基线所做的三角化,这正是使得度量尺度可观测的原因:单目相机只能恢复到一个未知比例因子为止的几何结构,而双目相机则能把它锚定在米这个单位上。与 RGB-D 传感器(结构光或飞行时间法)相比,被动式立体视觉能够在户外阳光下和更远的距离上工作,但在缺乏纹理的表面上会遇到困难,因为匹配没有可以锁定的依据。
对SLAM的意义
双目视觉一次性消除了单目SLAM中最棘手的两个问题:尺度模糊和初始化。每一个双目帧都能立即产生度量三维地图点——不需要运动视差来启动地图——而且尺度不会漂移,因为每一个新帧都会重新测量它。这就是为什么双目(以及双目-惯性)配置是机器人部署中的默认选择,也是为什么理解视差-深度关系及其平方级误差增长对于选择基线、设定可靠深度阈值(例如 ORB-SLAM2 中”近点与远点”的区分)至关重要。