立体视觉:从视差估计到深度恢复

FreeGuideOnline 最新 2026-06-20

什么是立体视觉?

立体视觉(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),从而生成稠密的点云。

完整流程与系统步骤

建立一个实用的立体视觉系统,通常需要遵循以下流水线:

  1. 相机标定:分别对左、右相机进行单目标定(获取内参和畸变系数),然后进行双目标定(获取旋转矩阵和平移向量,即外部参数)。
  2. 立体校正:利用标定结果,通过 Bouguet 算法或类似方法,将非共面、非行对齐的两幅图像投影变换为严格行对齐的、畸变已消除的标准立体像对。此步骤后,匹配搜索可完全限制在一维水平线上。
  3. 立体匹配:应用前述的局部/半全局/学习方法,在校正后的图像对上计算稠密视差图。
  4. 深度计算与点云生成:利用焦距、基线和视差图,通过 Z = (f * B) / d 计算每个像素的深度,并可进一步生成三维点云。
  5. 后处理与滤波:使用中值滤波、小斑点移除、视差图填充等方法优化深度图,使其更平滑、完整。

进阶话题与未来方向

  • 主动立体视觉:使用结构光(如条纹图案)或激光散斑主动投射纹理,可彻底解决弱纹理区域的匹配问题,是工业高精度测量和早期 Kinect 的核心技术。
  • 多视图立体视觉(MVS):将双目思想扩展到多个视角(运动恢复结构 SFM 后的一步),生成更完整和精细的场景三维重建。
  • 无监督/自监督深度估计:利用光度重投影误差作为监督信号训练网络,无需昂贵的真实视差标签,使得在大规模非结构化数据上训练成为可能。
  • 事件相机的立体视觉:结合新型事件传感器极低延迟和高动态范围的特性,实现高速、极端光照下的立体深度感知。

掌握从视差估计到深度恢复的立体视觉原理,是迈入三维感知、自动驾驶、机器人导航和增强现实等前沿领域的坚实基础。