第 2 章 射影几何与多视图¶
一台相机给出的是"从光心出发的一条视线",深度被彻底压掉;两台相机(或一台相机的两个时刻)之间的几何约束,才能把三维结构重新解出来。对极几何、三角化与 PnP 这三块多视图地基是视觉里程计、SfM、SLAM 共同的数学内核,第 6 章与 control-note 第 9 章都建在它上面。
原理以 Hartley & Zisserman《Multiple View Geometry in Computer Vision》与 Szeliski《Computer Vision: Algorithms and Applications》为基线,代码以 OpenCV 5.0.0 实现。
一个投影矩阵派生的两块多视图地基:
flowchart LR
proj["投影矩阵 P = K[R | t]"] --> epi["对极几何<br/>基础矩阵 F / 本质矩阵 E"]
epi --> tri["三角化:恢复三维结构"]
epi --> pnp["PnP:已知 3D 求位姿"]
1. 齐次坐标与投影矩阵¶
第 1 章已见:针孔投影 \(s\mathbf{u}=K[R|t]\mathbf{X}\) 把三维点映到像素。把它写成单个 \(3\times4\) 矩阵 \(P=K[R|t]\),就是一个相机矩阵(camera matrix)——它编码了该视图的全部内外参。几个基本对偶关系:
- 三维点 = \(\mathbb{P}^3\) 中的齐次向量(4 维,差一个尺度);像点 = \(\mathbb{P}^2\) 中的齐次向量(3 维)。
- 一条视线(back-project ray)由像点唯一确定;两张像的对应约束把两条视线钉在同一点。
- 投影矩阵 \(P\) 的零空间(\(P\mathbf{C}=0\))就是相机光心 \(\mathbf{C}\)。
秩与自由度:\(P\) 是 \(3\times4\) 矩阵,共 12 个元素,去掉一个整体尺度后为 11 个自由度。这些计数决定了后面"最少需要几个点对应"才能定住一个几何量。
自由度计数直接决定最小样本数:\(P\) 有 11 个自由度,每对 3D-2D 对应给 2 个方程,所以 DLT 求位姿至少 6 对非共面点;\(F\) 是 7 个自由度,于是有 7 点法;\(E\) 是 5 个,于是有 5 点法。记住这条换算,碰到"4 点解基础矩阵"这类说法就能立即判断:它必然额外用了约束(已知内参、点共面,或把问题换成了单应)。
2. 对极几何与本质 / 基础矩阵¶
同一物点在两视图的像点 \(\mathbf{u},\mathbf{u}'\) 满足对极约束(epipolar constraint):
\(F\) 是基础矩阵(fundamental matrix),7 个自由度;当两视图已按同一内参归一化(去畸变 + 除以 \(K\))时退化为本质矩阵(essential matrix) \(E=[t]_{\times}R\),5 个自由度。几何含义:给定左像点 \(\mathbf{u}\),右像中满足约束的点落在一条极线(epipolar line) \(l'=F\mathbf{u}\) 上——对应搜索从二维降到一维。
本质矩阵与基础矩阵的差别只在"是否已内参归一化":\(E\) 只含相对位姿(旋转 3 + 平移方向 2,共 5 个自由度),\(F=K'^{-\top}EK^{-1}\);\(K=K'=I\) 时两者相同。求解都用 SVD 施加秩-2 约束(\(E\) 的两个非零奇异值相等,\(F\) 无此约束)。
最小样(合成 300 点、两视图相对位姿已知、像点加 0.5 px 噪声、注入 8% 外点):
## 像素坐标直接解基础矩阵:8 点线性解,或用 RANSAC 包住 8 点采样
F, mask = cv2.findFundamentalMat(pts1, pts2, cv2.FM_8POINT)
F, mask = cv2.findFundamentalMat(pts1, pts2, cv2.FM_RANSAC, 1.0, 0.99, 2000)
## 已标定时解本质矩阵:5 点法在 findEssentialMat 内,不在 findFundamentalMat 里
E, mask = cv2.findEssentialMat(pts1, pts2, K, cv2.RANSAC, 0.99, 1.0)
三点判读:
- 干净数据下 8 点法的极线距离更低:它用满 8 对约束、无采样随机性;5 点法是本质矩阵的最小解(Nister),只需 5 对但最多产生 10 个候选解需要筛选,因此它的价值在外点鲁棒与最小样本,而不是精度。
- 非鲁棒求解遇外点即崩:线性最小二乘对错配没有任何抵抗,中位极线距离会被少数外点拉成量级性的偏差;要鲁棒就得上 RANSAC 或 LMedS 包住求解。
- RANSAC 与 LMedS 的取舍:RANSAC 以固定阈值判内点,阈值偏严时牺牲召回换精度;LMedS 用中位数残差自适应阈值,召回更高但更慢。两者都只负责挑内点集,最终仍用内点重解。
3. 三角化与 PnP¶
有了相对位姿,两条视线求交即三角化(triangulation)。直接线性解(DLT)对每个对应点写两条 \(\mathbf{u}\times(P\mathbf{X})=0\) 方程堆叠成齐次系统,SVD 取最小奇异值向量。关键坑:投影矩阵必须含内参 \(K\),只喂 \([R|t]\) 会让重建完全跑偏。
从 recoverPose(本质矩阵分解出 \(R,t\),\(t\) 归一化)恢复位姿后三角化 300 点,尺度归一后的结果与真值吻合:旋转与平移方向误差在亚度内,三角化深度的相对误差随点距与基线变化,横向位置误差在毫米量级。这些数值只反映该合成场景,真实数据随噪声、外点与匹配质量变化。
单目尺度不可观在这里看得很清楚:本质矩阵只能给单位平移方向,三角化结果带一个任意全局尺度(用中位尺度归一后才能和真值比深度)。这个尺度歧义是单目 SLAM 的固有属性,需要外部里程、已知物体尺寸或双目基线来锚定(第 4 章)。
PnP(perspective-n-point) 是反向问题:已知若干 3D 点及其 2D 像、已知 \(K\),求当前相机位姿。solvePnP 提供多解法:
ok, rvec, tvec = cv2.solvePnP(objectPoints, imagePoints, K, None, flags=cv2.SOLVEPNP_EPNP)
对非共线点集,EPnP 把 3D 点表为 4 个虚拟控制点的加权和,闭式解、适合实时;迭代法(Levenberg-Marquardt)在初值上精修;RANSAC 版剔除误匹配。共面点需切 SOLVEPNP_IPPE(平面专用),否则退化——这与第 1 章标定"非共线"的要求同源。
三角化的精度不由算法决定,而由交会角决定:两条视线夹角越小,交点在深度方向的不确定性越大,远点与小基线同时出现时深度最差。工程上给三角化加两重判据——视差角下限与重投影误差上限,不满足的点丢弃而不是硬解。DLT 本身对坐标尺度敏感,输入先做归一化(平移到质心、缩放到平均距离 \(\sqrt{2}\)),否则数值秩容易失守。
4. 姿态从相对几何恢复¶
把第 2、3 节合起来就是视觉里程计的最小单元:连续两帧 → 特征匹配 → findEssentialMat + recoverPose 得帧间相对位姿 → 三角化得稀疏结构 → 累积成轨迹。这条链的每一步都有对应的失效模式:
- 相对位姿在小基线(两帧太近)时三角化条件数爆炸,深度误差随 \(1/\text{基线}\) 放大;
- 纯旋转无平移时 \(t\) 不可观(对极几何退化),这是全景/原地转向场景里程计失效的根因;
- 尺度不累积但会漂移,需要回环或外部锚定(第 6 章、
control-note第 9 章融合)。
以上构成 VIO 的几何地基;概率侧(残差加权、协方差传播)在第 6 章 BA 直觉与 control-note 中展开。
纯旋转可用模型选择检出:同一批匹配在单应模型下的残差明显小于基础矩阵模型时,就应判为旋转主导(单应的秩-2 结构与 \(t\approx0\) 等价),此时不要用 \(E\) 分解出的平移——它只是噪声的方向。
射影几何的历史脉络与不变量(交比不变、对合等)对本章的工程结论无直接影响,降为背景不展开。
5. 要点¶
- 相机矩阵 \(P=K[R|t]\) 编码一个视图的全部几何,零空间即光心;对极约束把对应搜索从二维降到一维极线。
- 本质矩阵(归一化、5 自由度)与基础矩阵(像素、7 自由度)都靠 SVD 施加秩-2;8 点法用满约束、5 点法胜在外点鲁棒与最小样本。
- 三角化必须先乘 \(K\);单目相对位姿只给方向不给尺度,深度误差随基线变小而放大。
- PnP 求当前位姿,EPnP 闭式实时、共面切 IPPE;共线/共面退化在标定、PnP、对极处处同源。
- 5 点法属于
findEssentialMat(本质矩阵);findFundamentalMat提供 7 点、8 点、RANSAC 与 LMedS,入口不同。
参考文献与延伸阅读¶
- Hartley, R., & Zisserman, A. Multiple View Geometry in Computer Vision (2nd ed.). Cambridge University Press, 2004. DOI
- Nistér, D. An Efficient Solution to the Five-Point Relative Pose Problem. IEEE TPAMI, 2004. DOI
- Lepetit, V., Moreno-Noguer, F., & Fua, P. EPnP: An Accurate O(n) Solution to the PnP Problem. IJCV, 2009. DOI
- OpenCV. calib3d 模块文档. 文档