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对。

求解步骤其实很直观:

  1. 构建线性方程组:每对匹配点(x₁, y₁)和(x₂, y₂)可以写出一个方程
  2. SVD分解:对系数矩阵做奇异值分解,最小奇异值对应的右奇异向量就是F的解
  3. 秩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 知识体系总览

下面这张图总结了本章的核心逻辑:

2D-2D对极几何知识体系 两帧图像 + 匹配点 场景是否平面?相机是否纯旋转? 单应矩阵 H 4点法求解 基础矩阵 F 八点法求解 旋转R + 平移t (分解H得到) 旋转R + 平移t (分解E得到) 相机位姿估计结果

这张图把整个流程串起来了。从两帧图像和匹配点出发,先判断场景特性,然后选择用单应矩阵还是基础矩阵,最后分解得到相机运动。每一步都有对应的数学工具和工程技巧。

好了,这一章的内容就到这里。对极几何是视觉SLAM的基石,理解透了,后面的三角化、PnP、BA都会轻松很多。记住我强调的几个坑:坐标归一化、纯旋转退化、平面场景判断。这些在工程中都是血泪教训换来的。