立体视觉:从视差估计到深度恢复
什么是立体视觉?
立体视觉(Stereo Vision)是一种通过分析从不同视角拍摄的同一场景的两幅或多幅图像,来恢复场景三维结构的技术。其核心思想源于人类双眼感知深度的机制:由于左右眼存在约6-7厘米的水平间距(基线),同一空间点在两眼视网膜上的成像位置存在微小差异,这种位置差被称为 视差(Disparity)。大脑融合这两个存在视差的图像,我们便能感受到物体的远近,即深度信息。
在计算机视觉中,立体视觉系统通常由两个水平放置的相机组成(称为双目立体系统)。通过计算左右图像中对应像素点的视差值,并结合相机的几何参数,即可精确地计算出该点到相机平面的距离(即深度)。这一过程被简洁地归纳为:视差估计 → 深度恢复。
视差估计的基本原理
对极几何与视差
为了约束对应点的搜索空间,立体视觉依赖于一个极重要的几何模型:对极几何(Epipolar Geometry)。
- 极平面(Epipolar Plane):由三维空间点
P和两个相机光心O_l,O_r共同确定的平面。 - 极点(Epipole):一个相机光心在另一个相机成像平面上的投影点。
- 极线(Epipolar Line):极平面与两个成像平面的交线。关键性质是:左图上一点
p_l在右图上的对应点p_r,必然位于该点对应的极线上。这被称为 极线约束(Epipolar Constraint)。
在理想的标准立体系统中,两个相机光轴完全平行,成像平面共面,且像素行严格对齐。此时,极线变为水平的图像行。这意味着,寻找左图上某一点 (x, y) 在右图上的匹配点时,只需在同一行 y 上进行一维搜索即可。这极大地简化了匹配难题。
视差 d 即定义为左图像素坐标 x_l 与右图对应点坐标 x_r 的差值:
d = x_l - x_r
视差图的计算(立体匹配)
立体匹配(Stereo Matching) 是立体视觉中最核心也最具挑战的一步,其目标是为左(或右)图中的每个像素找到另一幅图中的对应点,从而生成稠密的视差图。主流方法分为两类:
1. 局部匹配方法
基于局部窗口的相似度度量。对于左图中的一个像素,以其为中心取一个支持窗口,然后在右图的同一水平行上滑动窗口,计算匹配代价。
- 匹配代价函数:衡量两个窗口的相似程度。
- 绝对差之和(SAD):速度快,但对光照变化敏感。
- 平方差之和(SSD):对大差异惩罚更重。
- 归一化互相关(NCC):对线性光照变化鲁棒,是局部方法中的标准选择。
- Census 变换:比较窗口内像素与中心像素的灰度大小关系,生成二值码。对光照畸变和噪声有极强的鲁棒性,是实际应用中的优秀选择。
- 代价聚合:单纯基于单像素窗口的匹配噪声极大。为了提高鲁棒性,常对代价进行聚合,如使用盒滤波、双边滤波或引导滤波。一种高效且经典的方案是半全局块匹配(SGM 中的代价聚合部分),通过沿多个方向的一维路径优化能量函数,近似求解全局平滑约束,效果显著优于简单局部平滑。
2. 全局与半全局匹配方法
这类方法以一个包含数据项和平滑项的全局能量函数来建模视差图。数据项衡量像素在给定视差下的匹配代价,平滑项则鼓励相邻像素视差一致,但允许在深度不连续处(如物体边缘)中断。
- 半全局匹配(SGM) 是该思想的工程化典范。它定义一个能量函数:
E(D) = ∑_p ( C(p, D_p) + ∑_{q∈N_p} P1 * T[|D_p - D_q| = 1] + ∑_{q∈N_p} P2 * T[|D_p - D_q| > 1] )其中P1惩罚小差异(适应倾斜曲面),P2惩罚大差异(保留深度边界)。SGM 通过从多个方向(如8或16个方向)动态规划聚合代价,以近似二维全局优化,最终通过赢家通吃(WTA) 策略为每个像素选择最小聚合代价的视差。
3. 基于深度学习的方法
深度神经网络已主导了立体匹配排行榜。端到端的网络直接从左、右图像预测视差图,无需显式的手工匹配代价函数。
- 基本架构:通常包含特征提取孪生网络、代价体构建、3D 卷积或循环正则化、视差回归等模块。代表性的有 PSMNet、GC-Net 等。
- 优势:能够学习到强健的图像特征和上下文信息,在纹理缺失、反光、重复纹理等挑战性区域表现远优于传统方法。目前最先进的方法(如 RAFT-Stereo)基于迭代光流的思想,在精度和泛化性上达到了新高度。
视差估计的挑战
盲目地在平坦区域、强镜面反射、弱纹理或重复纹理区域寻找匹配,极易产生错误视差。常见的后处理手段包括:
- 左右一致性检验:分别以左、右图为参考图计算视差图,若左图的视差值
d_l(p)与右图对应点的视差d_r(p - d_l)不一致,则标记为无效。 - 唯一性约束:一个点只能有一个正确匹配。
- 亚像素精化:通过对代价体在离散视差层级周围进行抛物线或二次函数拟合,获得浮点精度的视差,使深度图更平滑。
从视差到深度的恢复
在标准双目立体系统中,一旦获得视差 d,结合系统标定参数,可通过简单的三角测量原理恢复深度 Z。
设两个相机光心距离(基线)为 B,相机焦距为 f(以像素为单位)。根据相似三角形关系,可得深度公式:
Z = (f * B) / d
这里的 d 必须以像素为单位。若 d 为零(即无穷远点),深度无法计算。由此公式可见重要性质:
- 深度与视差成反比:在视差较小的远处,微小的视差误差会导致巨大的深度误差。
- 深度分辨率与基线成正比:基线越长,相同距离处的视差越大,深度测量越精确,但过长的基线会增加远近物体匹配困难和遮挡。
- 深度与焦距成正比:使用长焦镜头(大
f)也能提高远距精度,但会缩小视场。
有了相机内参矩阵和校正后的图像,可以进一步将像素坐标 (u, v) 与视差 d 联合,还原出点的三维空间坐标 (X, Y, Z),从而生成稠密的点云。
完整流程与系统步骤
建立一个实用的立体视觉系统,通常需要遵循以下流水线:
- 相机标定:分别对左、右相机进行单目标定(获取内参和畸变系数),然后进行双目标定(获取旋转矩阵和平移向量,即外部参数)。
- 立体校正:利用标定结果,通过 Bouguet 算法或类似方法,将非共面、非行对齐的两幅图像投影变换为严格行对齐的、畸变已消除的标准立体像对。此步骤后,匹配搜索可完全限制在一维水平线上。
- 立体匹配:应用前述的局部/半全局/学习方法,在校正后的图像对上计算稠密视差图。
- 深度计算与点云生成:利用焦距、基线和视差图,通过
Z = (f * B) / d计算每个像素的深度,并可进一步生成三维点云。 - 后处理与滤波:使用中值滤波、小斑点移除、视差图填充等方法优化深度图,使其更平滑、完整。
进阶话题与未来方向
- 主动立体视觉:使用结构光(如条纹图案)或激光散斑主动投射纹理,可彻底解决弱纹理区域的匹配问题,是工业高精度测量和早期 Kinect 的核心技术。
- 多视图立体视觉(MVS):将双目思想扩展到多个视角(运动恢复结构 SFM 后的一步),生成更完整和精细的场景三维重建。
- 无监督/自监督深度估计:利用光度重投影误差作为监督信号训练网络,无需昂贵的真实视差标签,使得在大规模非结构化数据上训练成为可能。
- 事件相机的立体视觉:结合新型事件传感器极低延迟和高动态范围的特性,实现高速、极端光照下的立体深度感知。
掌握从视差估计到深度恢复的立体视觉原理,是迈入三维感知、自动驾驶、机器人导航和增强现实等前沿领域的坚实基础。