3、极线几何:对极约束、本质矩阵、基础矩阵、极线校正原理与实现

双目立体匹配的核心任务是解决“左图像素点在右图像中的对应位置在哪里”的问题。如果直接在二维图像平面上进行全图搜索,计算量巨大且极易产生误匹配。极线几何(Epipolar Geometry)正是描述两幅图像之间投影几何关系的数学框架,它将对应点的搜索空间从二维平面压缩到一条直线(极线)上,从根本上降低了匹配的复杂度和歧义性。本章将深入剖析对极约束的数学本质,厘清本质矩阵与基础矩阵的区别与联系,并详细讲解极线校正(Stereo Rectification)的原理与工程实现路径。

极线几何核心关系与校正链路 左相机 C₁ 右相机 C₂ P (X,Y,Z) 基线 T 左图像平面 极点 e₁ 极线 l₁ p₁ 右图像平面 极点 e₂ 极线 l₂ p₂ 对极平面 π(由基线 T 与点 P 确定) p₂ᵀ F p₁ = 0 F = K₂⁻ᵀ E K₁⁻¹ = K₂⁻ᵀ [t]ₓ R K₁⁻¹ 校正后:行对齐 搜索范围 → 水平线 校正后:行对齐 视差 d = x₁ - x₂

上图展示了双目视觉中最基本的几何关系:空间点 P 分别投影到左右相机成像平面上的点 p₁ 和 p₂。两个相机光心 C₁、C₂ 的连线称为基线 T,点 P 与基线构成的平面称为对极平面 π。对极平面与左右图像平面的交线 l₁、l₂ 即为极线。对极约束的核心结论是:左图上任意一点 p₁,其在右图上的对应点 p₂ 必然位于右图的极线 l₂ 上。这一约束将二维搜索降为一维搜索,是立体匹配效率与鲁棒性的基石。

3.1 对极约束的数学表达与几何意义

3.1.1 核心原理:从三维空间到二维投影的约束传递

对极约束的数学本质是共面约束。空间点 P、左光心 C₁、右光心 C₂ 三点确定一个平面(对极平面)。根据相机投影模型,左像点 p₁ 对应的三维射线 C₁P 上的所有点,在右相机中投影形成的轨迹恰好就是极线 l₂。因此,对于左图中的特征点 p₁,我们无需在右图全图搜索,只需沿极线 l₂ 进行一维匹配即可。

用齐次坐标表示,设左右相机的投影矩阵分别为 P₁ 和 P₂,则对极约束可以写成代数形式:

p₂ᵀ F p₁ = 0

其中 F 是 3×3 的基础矩阵(Fundamental Matrix),秩为 2,自由度为 7。它编码了两个相机之间的全部内参和相对位姿信息。当左右相机内参已知时,可以进一步归一化到本质矩阵(Essential Matrix)E:

E = K₂ᵀ F K₁

本质矩阵 E 仅与相机的相对旋转 R 和平移 t 有关,其自由度为 5(3 旋转 + 3 平移 - 1 尺度模糊)。E 的奇异值具有特殊形式 [σ, σ, 0],这一性质常用于 E 的分解与位姿恢复。

3.1.2 判断方法:如何快速判断点是否满足对极约束

在实际工程中,我们经常需要验证一组匹配点 (p₁, p₂) 是否满足对极几何关系,或者用于剔除误匹配(如 RANSAC 中的外点判断)。操作流程如下:

  1. 归一化坐标:将像素坐标转换为归一化相机坐标(若使用基础矩阵则跳过此步)。
  2. 计算代数误差:计算 p₂ᵀ F p₁ 的值,该值理论上应为 0。
  3. 计算几何误差(Sampson 距离):考虑噪声影响,更稳健的做法是计算点到极线的距离。极线 l₂ = F p₁,则点 p₂ 到极线的距离为:
d = |p₂ᵀ F p₁| / sqrt( (F p₁)₁² + (F p₁)₂² )

其中 (F p₁)₁ 和 (F p₁)₂ 表示向量 F p₁ 的前两个分量。若 d 小于阈值(通常 1~2 像素),则认为该匹配对满足对极约束。

矩阵类型 输入信息 自由度 核心性质 典型应用
基础矩阵 F 像素坐标 + 内参未知 7 秩为 2,奇异值 [σ₁, σ₂, 0] 未标定双目、特征匹配剔除
本质矩阵 E 归一化坐标 + 内参已知 5 奇异值 [σ, σ, 0] 标定双目、位姿恢复
单应矩阵 H 像素坐标(平面场景) 8 满秩,可逆 平面场景、图像拼接

3.2 本质矩阵与基础矩阵的深入辨析

3.2.1 核心原理:两者之间的桥梁与差异

本质矩阵 E 和基础矩阵 F 都描述了对极约束,但应用前提不同。E 定义在归一化图像坐标下,即假设内参矩阵 K 已知并将像素坐标转换为相机坐标;而 F 直接作用于像素坐标,隐含了内参信息。两者的转换关系为:

F = K₂⁻ᵀ E K₁⁻¹

从几何角度看,E 的物理意义更纯粹——它只包含相机间的相对运动(R, t),与相机内参无关。这使得 E 在视觉里程计(VO)、SLAM 中成为恢复相机位姿的首选。而 F 在未标定场景(如仅有两幅图像但无相机参数)中更为实用,可以通过 8 点算法直接从匹配点对中估计。

3.2.2 操作流程:从匹配点估计 F 与 E

以经典的 8 点算法为例,估计基础矩阵的步骤如下:

  1. 数据归一化:将匹配点坐标平移至质心并缩放至均方根距离为 √2,以提升数值稳定性。
  2. 构建线性方程组:对于每一对匹配点 (u₁, v₁, 1) 和 (u₂, v₂, 1),展开 p₂ᵀ F p₁ = 0,得到一个线性方程,未知数为 F 的 9 个元素。
  3. SVD 求解:堆叠至少 8 个方程,使用奇异值分解(SVD)求解最小二乘解。
  4. 秩约束强制:将求解得到的 F 矩阵进行 SVD,将其最小奇异值置为 0,再重构矩阵,使其满足秩为 2 的性质。
  5. 去归一化:将结果变换回原始坐标尺度。

若已知内参 K₁、K₂,则可通过 E = K₂ᵀ F K₁ 得到本质矩阵,再对 E 进行 SVD 分解(E = UΣVᵀ),结合 W 矩阵(W = [0,-1,0; 1,0,0; 0,0,1])可恢复出 4 组可能的 (R, t) 解,最后通过三角化检验点的深度正负来筛选唯一正确解。

经验提示:在工程中,直接使用 8 点算法对噪声敏感。推荐先使用归一化 8 点算法得到初始 F,再通过 RANSAC 迭代剔除误匹配(外点),最后用所有内点重新优化 F(如使用 Levenberg-Marquardt 最小化 Sampson 距离)。这样可以显著提升 F 矩阵的精度和鲁棒性。

3.3 极线校正:原理与实现

3.3.1 核心原理:将极线变为水平线

虽然对极约束已将搜索从二维降为一维,但极线通常是倾斜的,沿倾斜方向采样在工程上并不方便。极线校正(Stereo Rectification)通过对左右图像进行重投影变换,使得两幅图像的极线变为水平且行对齐。校正后,左图 (x₁, y) 的对应点必然在右图同一行 (x₂, y) 上,此时视差 d = x₁ - x₂ 仅与深度有关,匹配问题简化为水平方向的一维搜索。

校正的核心思想是:构造两个新的虚拟相机,它们具有相同的朝向(光轴平行)、相同的内参,并且光心连线(新基线)与原基线平行。具体实现通常采用 Bouguet 算法:

  1. 将右相机相对于左相机的旋转矩阵 R 分解为两半:R_left = R^(1/2),R_right = R^(-1/2),使左右图像各旋转一半,消除旋转差异。
  2. 构造旋转矩阵 R_rect,使新坐标系的 X 轴与基线方向平行,Y 轴与 X 轴正交且垂直于原光轴方向,Z 轴与 X、Y 构成右手系。
  3. 最终校正矩阵为 R_rect_left = R_rect * R_left,R_rect_right = R_rect * R_right。
  4. 结合内参矩阵,计算新的投影矩阵和重映射查找表(map_x, map_y)。

3.3.2 操作流程:OpenCV 实现步骤

在 OpenCV 中,极线校正的典型流程如下:

// 1. 读取标定参数(内参 K1, K2,畸变系数 D1, D2,相对位姿 R, T)
// 2. 调用 stereoRectify 计算校正变换
cv::stereoRectify(K1, D1, K2, D2, imageSize, R, T, 
                  R1, R2, P1, P2, Q, 
                  cv::CALIB_ZERO_DISPARITY, alpha);

// 3. 计算校正查找表
cv::initUndistortRectifyMap(K1, D1, R1, P1, imageSize, CV_32FC1, map1x, map1y);
cv::initUndistortRectifyMap(K2, D2, R2, P2, imageSize, CV_32FC1, map2x, map2y);

// 4. 应用重映射
cv::remap(imgLeft, rectifiedLeft, map1x, map1y, cv::INTER_LINEAR);
cv::remap(imgRight, rectifiedRight, map2x, map2y, cv::INTER_LINEAR);

其中 Q 矩阵为视差到深度的转换矩阵,后续章节会用到。参数 alpha 控制校正后图像的裁剪范围,alpha=0 时图像裁剪最紧,alpha=1 时保留所有像素但黑色区域较多。

3.3.3 案例拆解:双目相机校正实战

背景与约束:某机器人平台搭载双目相机,基线长度 120mm,图像分辨率 1280×720。标定得到左右内参 K₁、K₂ 及相对位姿 R(近似单位阵)、T = [120mm, 0, 0]ᵀ。目标是将图像校正为理想的行对齐状态,以便后续使用 SGM 算法进行稠密匹配。

初始现象:直接使用原始图像进行匹配时,极线倾斜约 3.5°,导致匹配窗口无法水平对齐,误匹配率高达 15%。

关键参数与操作:

  • 使用 cv::stereoRectify 时设置 alpha=0,以最大化有效像素区域。
  • 校正后通过 cv::computeCorrespondEpilines 验证极线是否水平:随机选取 20 对特征点,计算右图极线与水平线的夹角,平均误差应小于 0.1°。
  • 检查视差图质量:校正后使用简单的块匹配(Block Matching)测试,误匹配率降至 2% 以下。

结果对比:校正前,极线倾斜导致搜索范围需覆盖 ±5 像素的垂直偏移;校正后,垂直偏移为 0,搜索范围仅需水平方向 ±60 像素(对应最小深度 0.5m)。计算量降低约 40%,且匹配鲁棒性显著提升。

风险与代价:校正过程会引入图像重采样插值,导致边缘轻微模糊;同时校正后的图像存在黑色无效区域(尤其是 alpha=0 时),需要后续处理时进行掩膜(mask)操作。

常见误区提醒:极线校正并不能消除镜头畸变,它只是对畸变校正后的图像进行重投影。因此,在立体校正前必须先对左右图像分别进行畸变校正(undistort),否则校正结果会残留径向畸变,导致极线不水平。

3.4 常见误区与总结复盘

3.4.1 误区一:混淆基础矩阵与本质矩阵的使用场景

初学者常在不具备内参的情况下强行使用本质矩阵,或在已标定系统中错误地使用基础矩阵。本质矩阵要求输入为归一化坐标,若直接使用像素坐标,则必须通过内参转换。正确做法是:未标定系统用 F,已标定系统用 E,且 E 的分解结果可直接用于位姿估计。

3.4.2 误区二:忽略极线校正后的边界效应

校正后的图像边缘会出现黑色区域,这些区域的像素没有有效视差。在后续立体匹配中,必须对这些区域进行掩膜处理,否则会产生错误的视差值。建议在匹配前生成有效的 ROI 区域。

3.4.3 误区三:认为校正后视差与深度是线性关系

即使校正完美,视差 d 与深度 Z 的关系仍为非线性:Z = f·B / d,其中 f 为焦距(像素单位),B 为基线长度。当 d 较小时,深度对 d 的微小变化非常敏感,因此远距离物体的深度精度较低。

检查项 验证方法 通过标准
极线水平度 随机取 20 对匹配点,计算极线斜率 斜率值 < 0.01(约 0.6°)
行对齐精度 计算对应点行坐标差值的均方根误差 RMSE < 0.5 像素
重投影误差 三角化后反投影至原图像 平均误差 < 0.3 像素

总结:极线几何是双目视觉的数学骨架。对极约束提供了匹配搜索的降维依据,本质矩阵与基础矩阵是这一约束的代数载体,而极线校正则是将理论转化为高效工程实现的桥梁。掌握本章内容后,读者应能够独立完成从标定参数到校正图像的完整链路,并为后续的立体匹配算法(如 SGM、BM)奠定坚实的数据基础。在实际项目中,务必重视标定参数的准确性,因为 F 和 E 的估计误差会直接传导至校正结果,最终影响深度图的质量。