Contents — find the section you need
稍微侧移相机并拍摄同一场景,你会发现近处物体相对于背景的移动幅度比远处物体更大。这种视差使你能够从二维图像中恢复三维形状和相机运动。但仅仅在图像间匹配“相同的物理点”是不够的。在充满错位、镜头畸变、纯旋转、平面和运动物体的真实图像中,你需要确定哪些点对与单次相机运动一致。极线几何正是用于此目的的通用语言。
这不仅仅关乎立体测量。运动结构重建 (SfM)、视觉里程计、视觉 SLAM、AR 平面跟踪、机器人自定位以及 COLMAP 的稀疏重建都依赖于对应关系和射影几何。本文始终保持坐标系的清晰明确,阐明每个矩阵的含义、应选择哪种估计器以及何时不应信任结果。
立体摄像头车辆示例图片:斯巴鲁 WRX S4 2.0GT-S EyeSight (Tokumeigakarinoaoshima, CC BY-SA 4.0), Wikimedia Commons。这是一张外观图,并非摄像头内部的特写。
0. 30 秒总结
-
由两个摄像头中心和一个三维点构成的平面称为极线平面。该平面将每幅图像切割成一条直线,因此一幅图像中的对应点可以仅出现在另一幅图像中的那条线上——即极线。
-
对于未校准的图像,基本矩阵F满足\mathbf{x}'^\mathsf{T}F\mathbf{x}=0。在已知内参的归一化坐标系中,使用本质矩阵E=[\mathbf{t}]_\times R。E恢复旋转R和平移的方向,但单个单目双视图对无法恢复平移的绝对尺度。
-
归一化的8点算法是一种易于实现的线性初始估计;5点算法是一种最小求解器,对于已校准的相机,它需要的对应点更少。两者都对失配敏感,因此在实践中,使用RANSAC/USAC去除异常值,并使用重投影误差进行评估。
-
三角测量法找到两条视线的交点,但当视差较小、基线较短或图像噪声较大时,深度信息会变得不稳定。较大。估计之后,光束法平差联合优化相机位姿和三维点。
-
对于仅包含平面的场景,或几乎纯旋转的相机,单应性矩阵 H 能很好地描述图像,而通过 F/E 进行的平移/深度恢复效果会下降。模型选择不应仅依赖于内点计数——应同时检查残差、视差、空间分布和手性。
1. 从坐标系构建双视图投影
设世界坐标系中的一个点为齐次坐标 \mathbf{X}=(X,Y,Z,1)^\mathsf{T}。针孔相机投影(按比例缩放)可表示为:
其中,\tilde{\mathbf{x}}=(u,v,1)^\mathsf{T} 为齐次图像坐标,K 为内参矩阵,R\in SO(3) 和 \mathbf{t} 为世界坐标系到相机坐标系的坐标。外参位。通常情况下:
其中 f_x,f_y 是以像素为单位的焦距,(c_x,c_y) 是主点,s 是倾斜度。校正畸变后,归一化图像坐标为 \mathbf{x}=K^{-1}\tilde{\mathbf{x}}。从这里开始,以左侧相机为参考,坐标为 P_1=K[I\mid\mathbf{0}],右侧相机为 P_2=K[R\mid\mathbf{t}]。
图中,C,C' 为相机中心,线段 CC' 为基线。由点 X 和两个中心定义的平面与左侧图像平面相交形成极线 l,与右侧图像平面相交形成极线 l'。在左图中找到对应点 \mathbf{x} 后,右图中的二维搜索区域将缩小为一条直线。对于校正后的立体图像对,该直线为水平线,对应搜索将变为沿同一扫描线的一维搜索。
2. 基本矩阵和基础矩阵
仅关注外参位,考虑已校准的归一化坐标 (\mathbf{x},\mathbf{x}')。从左侧相机到该点的视线方向为 \mathbf{x},在右侧相机坐标系中为 R\mathbf{x}。平移向量 \mathbf{t} 与两条视线位于同一平面这一事实可以表示为零标量三重积:
其中 [\mathbf{t}]_\times 是叉积的反对称矩阵形式。
此 E=[\mathbf{t}]_\times R 被称为本质矩阵。E 并非任意 3\times3 矩阵——它的秩为 2,且其两个非零奇异值相等。通过奇异值分解 (SVD) 投影到 E=U\operatorname{diag}(s,s,0)V^\mathsf{T} 的形式可以恢复这一物理约束。
对于直接使用原始像素坐标的未校准情况,
其中 F 是基础矩阵。 F\tilde{\mathbf{x}} 给出右图中的极线 l',F^\mathsf{T}\tilde{\mathbf{x}}' 给出左图中的极线 l。由于 F 吸收了内参,因此便于对图像对进行几何验证,但要以公制单位解释姿态,则需要进行标定。
| 矩阵 | 坐标 | 所需已知量 | 形状约束 | 输出结果 | 主要用途 |
|---|---|---|---|---|---|
| F | 原始像素齐次坐标 | 无 | 秩 2,7 自由度 | 极线 | 未标定 SfM,对应性验证 |
| E | K^{-1}\tilde{\mathbf{x}} | 两台相机的 K | 排名 2,奇异值 (s,s,0) | R 和 \mathbf{t} 的方向 | VO、SLAM、校准立体 |
| H | 平面上的像素或纯旋转像素 | 平面或旋转模型 | 通常为 8 自由度 | 平面变形 | AR 平面、图像拼接 |
极点的意义
右侧相机中心投影到左侧图像中的点是左侧极点 \mathbf{e},满足 F\mathbf{e}=0。同样,F^\mathsf{T}\mathbf{e}'=0 也满足 F\mathbf{e}=0。如果极点位于图像内部,极线呈放射状汇聚,表明相机大致向前或向后移动。如果极点位于无穷远处,极线几乎平行,表明相机大致向侧方移动。这是一个有用的诊断方法,但仅凭一个错误的估计值也可能导致不自然的极点位置,因此切勿仅凭此判断运动。
3. 基于对应关系估计矩阵:8 点算法
单个对应关系 \tilde{\mathbf{x}}=(u,v,1)^\mathsf{T} 和 \tilde{\mathbf{x}}'=(u',v',1)^\mathsf{T} 可以对 F 的九个元素施加一个线性约束。例如,对于 \mathbf{f}=\operatorname{vec}(F),
将八个或更多对应关系堆叠到矩阵 A 中,8 点算法取 A\mathbf{f}=0 的最小奇异向量。该算法名称源于满足自由度的八个对应关系,但在实际噪声情况下,最小二乘法会使用更多点。
使用原始像素坐标求解会导致坐标值的大小导致病态。 Hartley 的归一化 8 点算法使用相似变换 T,T' 对每幅图像的点集进行归一化,使质心为零,平均距离为 \sqrt{2},然后在该空间中求解,最终恢复
此外,对所得 F 进行奇异值分解 (SVD) 并将最小奇异值置零,可以强制秩为 2。这看似是一个次要的实现细节,但它对解的稳定性影响很大。
如果经过校准,同样的思路可以从归一化对应关系中构建 E 的初始估计值。但是,从 8 个点得到的线性解并不能自动满足本质矩阵更强的奇异值约束。因此,需要计算 E=U\operatorname{diag}(\sigma_1,\sigma_2,\sigma_3)V^\mathsf{T} 并将其替换为 \operatorname{diag}((\sigma_1+\sigma_2)/2,(\sigma_1+\sigma_2)/2,0) 来进行投影。
4. 五点算法:校准后缩小最小样本
本质矩阵有 5 个自由度。五点算法是一种最小求解器,它从 5 个对应关系中找到有限的 E 候选解集;Nistér 方法将零空间替换为多项式约束,枚举出最多 10 个实数解候选解。五点算法的推导和实现都比八点算法更复杂,但每个 RANSAC 假设只需要 5 个点的优势非常显著。
给定内点比例 w,单次抽样全部为内点的概率为 w^s,失败概率为 p,最小样本量为 s,所需迭代次数估计为:
对于 w=0.5,p=0.01:s=8 大约需要 1177 次迭代,而 s=5 大约需要 145 次迭代。实际上,这并非直接比较,因为像 PROSAC 这样的方法会根据匹配质量的顺序抽取样本并自适应地终止迭代。尽管如此,在低内点比例环境下,5 点算法的价值依然显而易见。
OpenCV 的 findEssentialMat 提供了 RANSAC/LMEDS 算法以及 5 点族实现,而 recoverPose 则负责候选分解和手性检查。对于实现者而言,确认输入是否无失真/归一化以及阈值使用的坐标单位比“我们调用了 5 点算法”这一事实更为重要。
5. RANSAC:利用几何信息并假设存在异常值
SIFT、ORB、SuperPoint 和 LoFTR 等匹配器会因重复纹理、反射、重复网格和遮挡而产生不匹配。使用最小二乘法将 F 拟合到所有对应点,使得少量错误就能破坏整个矩阵。RANSAC 重复以下步骤:
-
随机选择一组最小的对应点,并构建一个 F 或 E 假设。 2. 计算每个对应点的残差,并将残差小于阈值的对应点标记为内点。
-
保留支持度最高或鲁棒性得分最高的假设。
-
使用所有最终内点重新估计,并在必要时使用非线性优化进行改进。
不应仅使用代数误差 \mathbf{x}'^\mathsf{T}F\mathbf{x} 对极线约束进行阈值处理,因为它取决于 F 的尺度。在实践中,通常使用 Sampson 距离
代替。它是几何误差的一阶近似值——每个对应点到其极线距离的归一化度量。像素坐标的阈值取决于图像分辨率、关键点定位精度、残差失真和模糊程度。没有通用的“1 像素”阈值。您可以通过可视化残差直方图和图像上内点的空间分布来调整阈值。
当前版本的 OpenCV 也提供了 USAC 系列鲁棒估计算法。它结合了质量排序采样、局部优化和退化性检查,速度更快、稳定性更高,优于普通的 RANSAC 算法。然而,统计异常值剔除始终无法突破“大多数物体遵循单一的静态刚体运动”这一假设。如果帧的大部分区域是移动的车辆或人,则需要添加其他信息,例如语义掩码、运动分割、IMU 或深度信息。
6. 将 E 分解为姿态并选择合适的候选值
对于修正后的 E=U\operatorname{diag}(s,s,0)V^\mathsf{T},使用
可以得到旋转候选值 R=UWV^\mathsf{T} 或 UW^\mathsf{T}V^\mathsf{T},以及平移方向候选值 \pm U_{:,3}。旋转和符号共有 4 种组合。这里重要的是,仅凭双视图约束就能使所有候选点在代数上与相同的 E 一致。
选择过程利用了手性(正深度)。对于每个候选点,对少量内点进行三角测量,并选择在两个相机帧中都能使最多点满足 Z>0 的候选点。此外,还要检查旋转矩阵的行列式是否为 +1,重投影误差是否较小,以及视差是否足够。特别需要记住一个限制:\mathbf{t} 只能恢复到一定方向。将 \mathbf{t} 和所有 3D 点按相同比例缩放不会改变投影。已知立体基线、轮式里程计、IMU、已知大小的物体或 GNSS 可以提供比例尺。
7. 三角剖分:从两条射线到三维点
投影方程 \mathbf{x}\times(P\mathbf{X})=\mathbf{0} 会为每个视图生成两个独立的方程。DLT 三角剖分通过奇异值分解 (SVD) 求解由两个视图堆叠而成的线性系统 A\mathbf{X}=0;它很简单,OpenCV 的 triangulatePoints 形式与之非常接近。例如,令 \mathbf{p}_{ij}^\mathsf{T} 为 P_i 的第 j 行,则点 (u_i,v_i) 给出:
在最后除以齐次分量之前,请检查 w 是否非常小。
对于校正后的水平立体像对,这一点更加直观。视差为 d=u_L-u_R(左右水平坐标差),焦距为 f,基线为 B,
深度误差约为 \delta Z\simeq \frac{Z^2}{fB}\delta d。距离越远,焦距或基线越短,相同的 1 像素视差误差导致的深度误差就越大。因此,与其“匹配就添加到点云中”,不如使用三角测量角度、视差、重投影误差和正深度作为质量门控。
线性三角测量只是一个初始估计——它无法正确地最小化图像噪声。光束法平差联合优化相机位姿 P_i 和点 \mathbf{X}_j,求解以下问题:
其中 \rho 是鲁棒损失函数,例如 Huber 损失函数或 Cauchy 损失函数,\pi 是透视除法。这就是为什么使用 COLMAP、Theia 或 Ceres Solver 进行重建能够提高精度的原因。为了固定尺度自由度,将第一个相机放置在原点,并在必要时固定一个已知的尺度。
8. 极线几何与单应性矩阵的选择
当场景中的每个点都位于同一个平面 \pi 上,或者相机进行纯旋转时,图像之间的对应关系可以用 3×3 单应性矩阵 \tilde{\mathbf{x}}'\sim H\tilde{\mathbf{x}} 很好地描述。如果经过校准,平面法线为 \mathbf{n},距离为 d,
在纯旋转的情况下,平移项消失,H=KRK^{-1}。对于海报、桌子、建筑立面或远景平移镜头,H 成为一个优秀的模型,自然成为 AR 平面锚点和图像拼接的首选。
然而,仅从平面数据估计 F/E 可能会导致出现许多明显的内点,同时无法稳定地将 3D 结构与平移分离。相反,将一般的非平面场景强制转换为单个 H 会导致近处和远处的物体变形不一致。在实现过程中,使用 RANSAC 算法估计 F/E 和 H,并在重建后比较残差、解释点数、点分布和视差。如果仅根据匹配点数来决定是否接受模型,则模型可能会偏向于大面积的平面墙或占据图像中心的平面。
| 情况 | 第一个候选模型 | 结果 | 注意事项 |
|---|---|---|---|
| 已校准,通用 3D,存在平移 | E + 5 点算法 | 相对位姿,稀疏深度 | 尺度不确定,低视差下不稳定 |
| 未校准图像对 | F + 归一化 8 点算法 | 极线,对应性验证 | 没有 K,请勿解释物理位姿 |
| 近乎平面,海报,桌面 | H + 四点算法 | 平面变形,平面位姿候选 | 无平面外深度 |
| 纯旋转/全景 | H | 图像对齐,旋转 | 平移和深度不可观测 |
| 已知三维地图,二维观测 | PnP + RANSAC | 绝对位姿 | 取决于地图质量和比例尺 |
9. 校准不是预处理步骤——它是模型的一部分
在多个距离、倾斜角度和图像位置拍摄棋盘格、Charuco 或 AprilTag 网格,以估计 K 和畸变系数。对于归一化半径 r^2=x^2+y^2,布朗-康拉迪径向畸变大致可表示为:
对于广角镜头和鱼眼镜头,不要强制使用标准针孔畸变模型——选择 OpenCV 的鱼眼模型或与所用镜头匹配的模型。即使校准的平均重投影误差很小,误差结构也会在图像边缘、不同焦距、温度、焦点或分辨率变化时发生偏移。
在进行双视图处理之前,请确认校准值是在与当前拍摄相同的分辨率、裁剪和数码变焦条件下获得的。很容易将通过 undistortPoints 归一化的点估计 E 与从无畸变图像估计 F 混淆。务必阅读 API 是否在内部使用焦距、主点和畸变,或者是否需要已校正的坐标。对于立体相机,除了两个相机的内参之外,还需要使用 stereoCalibrate 函数获取相对位姿,并使用 stereoRectify 函数将极线校正为水平线。
10. OpenCV 中的最小流水线
以下框架用于从已校准的单目相机的两帧图像中获取相对位姿和经过质量滤波的稀疏 3D 点集。它使用 ORB 特征提取,但可以根据拍摄条件替换为 SIFT 或基于学习的匹配器。在实际应用中,您还需要记录曝光、运动物体和时间同步信息。
import cv2 as cv
import numpy as np
# K, dist are values calibrated for this capture resolution and lens
orb = cv.ORB_create(nfeatures=3000)
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
matches = cv.BFMatcher(cv.NORM_HAMMING).knnMatch(des1, des2, k=2)
good = [m for m, n in matches if m.distance < 0.75 * n.distance]
p1 = np.float32([kp1[m.queryIdx].pt for m in good])
p2 = np.float32([kp2[m.trainIdx].pt for m in good])
# threshold is in pixel units. Decide it from the residual distribution, not an initial guess.
E, mask = cv.findEssentialMat(p1, p2, K, method=cv.USAC_MAGSAC,
prob=0.999, threshold=1.0)
in1, in2 = p1[mask.ravel() != 0], p2[mask.ravel() != 0]
count, R, t, pose_mask = cv.recoverPose(E, in1, in2, K)
# P1, P2 are for normalized coordinates. Scale is arbitrary, so t's length is not a physical unit.
n1 = cv.undistortPoints(in1.reshape(-1, 1, 2), K, dist).reshape(-1, 2)
n2 = cv.undistortPoints(in2.reshape(-1, 1, 2), K, dist).reshape(-1, 2)
P1 = np.hstack([np.eye(3), np.zeros((3, 1))])
P2 = np.hstack([R, t])
X4 = cv.triangulatePoints(P1, P2, n1.T, n2.T)
X = (X4[:3] / X4[3]).T
# Further filter by positive depth in both views, reprojection error, and triangulation angle.
z1 = X[:, 2]
z2 = (R @ X.T + t).T[:, 2]
valid = (z1 > 0) & (z2 > 0) & np.isfinite(X).all(axis=1)
此示例将原始像素和 K 直接传递给 findEssentialMat,但如果畸变不可忽略,则首先传递来自 undistortPoints 的归一化点集,然后切换到相应的 API 形式。将 recoverPose 返回的 \mathbf{t} 视为“行驶距离”也是错误的。需要尺度信息的应用必须使用已知的基线、VIO、轮式里程计、深度传感器或类似方法来约束它。
COLMAP 将特征提取、匹配、几何验证、增量映射和光束法平差集成到一个统一的流程中。对于小型数据集,您可以通过图形用户界面 (GUI) 查看相机模型和重建结果。在命令行中,相机模型的选择、EXIF 焦距的处理方式、匹配策略(穷举/顺序/词汇树)以及图像对之间的时间间隔都会影响精度和计算成本。重建完成后,应检查的不是点云数量,而是已配准图像的数量、平均重投影误差、每幅图像的观测次数以及点云中的间隙。
11. 常见故障情况及诊断方法
小视差,无基线
在向前运动、远景或帧间隔较短的情况下,即使没有深度信息,也可能获得对应关系。如果极线看起来合理,但三角测量角接近于零,则应暂缓更新深度,而不是强制更新。根本的解决方法是增加关键帧之间的间距、使用横向运动进行观测,或使用具有已知基线的立体相机。
纯旋转或平面退化
在平移镜头或仅包含墙壁的视野中,H 具有解释力。E 的高内点计数并不一定意味着观察到了平移。记录 H 和 E 之间的竞争情况,并在三角测量后根据正深度率和中值视差进行门控。在增强现实(AR)海报追踪中,这并非失败——而是模型选择的正确性。
不匹配、重复图案、反射
窗户、瓷砖、书架、液晶屏幕和水面会产生相似的局部描述符。将比例测试、互最近邻匹配和几何RANSAC算法叠加使用,并检查内点是否分布在整个图像中。镜像和透明物体本身就破坏了刚体朗伯反射假设,因此无论如何调整阈值都无济于事。
动态物体和多重运动
RANSAC算法只会选择单个最大的运动。如果背景只占少数,它最终可能会估计出车辆的运动。根据您的应用场景,您可以选择语义排除人/车辆、聚类光流、运行多模型估计或与深度/IMU对齐。
镜头畸变、卷帘快门、异步
使用未经校正的广角镜头边缘会导致极线出现系统性弯曲。在快速运动中使用卷帘快门时,物体姿态会在单帧内发生变化,因此单个E只能提供近似值。即使立体图像对左右曝光时间存在轻微偏差,也会导致运动物体出现虚假视差。建议考虑使用全局快门、缩短曝光时间、行定时模型、基于IMU的校正以及硬件同步。
数值和坐标系错误
混合使用像素坐标和归一化坐标、混淆R,\mathbf{t}中的世界坐标系和相机坐标系、交换左右点的顺序以及在调整图像大小后忘记更新K都是常见的错误。不要轻信估计值——叠加对应关系和极线,并自动检查两个摄像头的深度是否为正值、重投影误差、\det R=1 和 R^\mathsf{T}R\simeq I。
12. 实用评估指标和设计检查清单
不要仅仅因为“返回了矩阵”就认为双视图估计成功。匹配计数会受到纹理数量的影响,而仅凭平均误差可能会掩盖一些好点。每帧保存以下信息,以便后续区分传感器/匹配器/姿态估计链中哪个环节出现故障:
-
检测计数、比率测试通过计数、RANSAC 内点计数/比率、图像网格单元分布
-
中值和上百分位数 Sampson 距离和重投影误差、正深度率、三角测量角度分布
-
H 与 E/F 的支持度计数和鲁棒性评分,以及模型被接受或拒绝的原因
-
估计旋转幅度、平移方向的时间连续性、与缩放后的外部传感器的一致性
-
曝光时间、增益、IMU 角速度、左右时间偏移、模糊度量、图像掩模比率
对于有真实值的研究或产品评估,请分别报告相对旋转误差、平移方向误差、轨迹 ATE/RPE 以及绝对/相对深度误差。由于单目双视图平移存在尺度模糊性,因此应明确说明误差是在归一化之后还是在Sim(3)对齐之后产生的。与其从平均值中排除失败帧,不如注明每次失败帧发生的退化或视觉条件,这样能更真实地反映系统的局限性。
13. 最新进展:学习是否取代了几何?
基于学习的关键点和描述符(SuperPoint)、由粗到精的匹配器(LoFTR)以及通用对应关系估计(LightGlue 等)在纹理或视角变化较小的情况下,可以比传统描述符产生更多的候选匹配。但是,网络返回的对应关系仍然可能错误,相机运动、平面、卷帘快门和尺度等物理模糊性并不会消失。在实际的SfM/SLAM应用中,通过对E/F/H进行鲁棒估计并结合光束法平差来验证学习到的匹配器输出的混合设置仍然是更实用的选择。
从更广义的角度来看,诸如 NeRF 和 3D 高斯散射等神经/显式场景表示方法也利用了多视角的一致性。这些方法能够实现极具吸引力的新视角合成,但对相机姿态和观测几何的质量非常敏感,许多实现都使用从 COLMAP 导出的姿态进行初始化。目前的研究仍在继续,致力于联合估计大规模、动态和反射环境中的对应关系、深度、分割、惯性数据和时间模型。
因此,采用新模型的决定不应仅仅基于“与 ORB 相比匹配数量是否增加”——还应考虑估计后的内点分布、姿态误差、计算延迟、GPU 要求、在训练条件之外的性能下降以及许可问题。几何并非过时的预处理步骤;它仍然是验证器,用于将学习到的模型的输出与真实的 3D 结构进行比较。
14. 结论
极线几何框架将两幅图像之间的对应关系从“看起来最相似的点”提升到“可以用单次相机运动解释的点”。如果已知内参,则通过 E=[\mathbf{t}]_\times R 进行相对位姿估计;否则,使用 F 验证极线和对应关系。8 点算法是理解和初始化的基础,5 点算法是用于鲁棒估计的高效最小求解器,RANSAC 是处理异常值的机制,而三角剖分加光束法平差则是通往 3D 空间的桥梁。
然而,当不存在视差、只有一个平面、纯旋转、存在大量运动物体或严重畸变/异步时,返回的矩阵并不能保证具有物理意义的深度或位移。设计模型选择时考虑单应性,管理标定条件,检查重投影误差和正深度,并将所有信息与外部尺度融合到一个单一的流程中,才能实现可复现的计算机视觉。
极线能否唯一确定匹配项?
它将搜索范围缩小到一条线上。
图像证据仍然必须能够定位该点,重复或遮挡可能会造成歧义。参考文献(原始资料和官方文档)
-
Fischler & Bolles,《随机抽样一致性》 (ACM 通讯,1981)](https://doi.org/10.1145/358669.358692)
评论
请先登录。
暂无数据。