4. 2D-2D对极几何:对极约束、本质矩阵与基础矩阵、八点法求解、单应矩阵与平面场景
各位同学,欢迎来到视觉SLAM里最经典的一章——2D-2D对极几何。
说实话,我刚入行那会儿,觉得对极几何就是一堆矩阵乘法,枯燥得很。直到第一次在真实场景里跑VO,发现两帧图像之间怎么都匹配不上,才意识到这东西有多重要。你想想看,相机在运动,前后两帧图像里同一个点,到底存在什么几何关系?这就是对极几何要回答的问题。
4.1 对极约束:两帧之间的几何纽带
先看一个最简单的场景。相机从位置O₁运动到O₂,空间点P在两个成像平面上的投影分别是p₁和p₂。那么O₁、O₂、P三点构成一个平面,叫极平面。极平面与两个成像平面的交线,就是极线。
关键来了:p₂一定在极线l₂上。这就是对极约束的核心。
用数学表达就是:
p₂ᵀ · F · p₁ = 0
其中F就是基础矩阵。这个公式看着简单,但背后藏着相机运动的全部信息。
核心理解:对极约束的本质是,它把2D匹配问题从全图搜索降维到一维极线搜索。没有这个约束,你需要在整张图里找匹配点,有了它,只需要沿着一条线找就行。
我在项目里遇到过一个问题:当相机纯旋转时,对极约束会退化。因为纯旋转时,所有极线都交于一点,基础矩阵变成奇异矩阵。嗯,这里要注意,纯旋转场景下,对极几何不适用,得用单应矩阵。
4.2 本质矩阵与基础矩阵:一对孪生兄弟
这两个矩阵很容易搞混。我刚开始学的时候也分不清,后来总结了一句话:本质矩阵E是基础矩阵F的“去内参”版本。
| 矩阵 | 输入坐标 | 自由度 | 适用场景 |
|---|---|---|---|
| 本质矩阵E | 归一化坐标 | 5 | 已知内参K |
| 基础矩阵F | 像素坐标 | 7 | 未知内参K |
它们的关系很简单:
F = K⁻ᵀ · E · K⁻¹
说白了,如果你已经标定了相机内参,直接用E就行,自由度更少,求解更稳定。如果内参未知,那就只能用F。
我的经验:在实际工程中,我建议尽量用本质矩阵E。因为内参通常都是标定好的,用E可以减少一个未知量,求解出来的旋转和平移也更稳定。我曾经在一个项目里用F做初始化,结果平移方向总是飘,换成E之后问题就解决了。
4.3 八点法求解:最经典的线性解法
八点法,顾名思义,至少需要8对匹配点来求解基础矩阵。为什么是8?因为F有9个元素,但尺度等价性去掉1个自由度,剩下8个未知数,一对点提供一个方程,所以至少8对。
求解步骤其实很直观:
- 构建线性方程组:每对匹配点(x₁, y₁)和(x₂, y₂)可以写出一个方程
- SVD分解:对系数矩阵做奇异值分解,最小奇异值对应的右奇异向量就是F的解
- 秩2约束:强制F的秩为2,因为本质矩阵的秩必须是2
代码实现大概是这样的:
def eight_point_algorithm(points1, points2):
# 1. 归一化坐标(非常重要!)
points1_norm, T1 = normalize_points(points1)
points2_norm, T2 = normalize_points(points2)
# 2. 构建A矩阵,每对点一行
A = build_A_matrix(points1_norm, points2_norm)
# 3. SVD求解
U, S, Vt = np.linalg.svd(A)
F = Vt[-1].reshape(3, 3)
# 4. 强制秩2约束
U, S, Vt = np.linalg.svd(F)
S[2] = 0
F = U @ np.diag(S) @ Vt
# 5. 反归一化
F = T2.T @ F @ T1
return F
避坑指南:我曾经在八点法上栽过跟头。当时直接用原始像素坐标求解,结果F矩阵完全不对。后来才发现,坐标归一化是必须的!不归一化的话,数值条件太差,SVD分解出来的结果根本不能用。记住:先归一化,再求解,最后反归一化。
4.4 单应矩阵与平面场景
单应矩阵H描述的是两个平面之间的映射关系。当场景中的点都落在同一个平面上时,对极几何就退化为单应变换。
单应矩阵的约束是:
p₂ = H · p₁
注意,这里是等号,不是对极约束里的等于0。这意味着单应矩阵是更严格的约束——它直接给出了点对点的映射关系。
什么时候用单应矩阵?
- 场景是平面:比如地面、墙面、桌面
- 相机纯旋转:此时对极几何失效,单应矩阵是唯一选择
- 低纹理场景:匹配点少,用单应矩阵更鲁棒
单应矩阵的求解只需要4对点(因为H有8个自由度,一对点提供2个方程)。求解方法也是线性方程组加SVD,和八点法类似,但更简单。
工程建议:在实际系统中,我通常会同时计算基础矩阵和单应矩阵,然后用一个评分机制来选择用哪个。比如,如果单应矩阵的重投影误差明显小于基础矩阵,说明场景接近平面,就用单应矩阵。反之,就用基础矩阵。这种策略在ORB-SLAM里也用到了,效果很好。
4.5 知识体系总览
下面这张图总结了本章的核心逻辑:
这张图把整个流程串起来了。从两帧图像和匹配点出发,先判断场景特性,然后选择用单应矩阵还是基础矩阵,最后分解得到相机运动。每一步都有对应的数学工具和工程技巧。
好了,这一章的内容就到这里。对极几何是视觉SLAM的基石,理解透了,后面的三角化、PnP、BA都会轻松很多。记住我强调的几个坑:坐标归一化、纯旋转退化、平面场景判断。这些在工程中都是血泪教训换来的。