计算机视觉核心:从对极几何到本质矩阵的鲁棒求解与工程实践
2026/8/6 5:49:34 网站建设 项目流程

1. 从两张照片到三维世界:对极几何的直观引入

想象一下,你站在一个广场上,用手机拍了一张照片。然后,你向左平移了几步,又拍了一张。这两张照片里的景物,比如远处的钟楼、近处的喷泉,位置肯定不一样了。你的大脑能瞬间理解这种变化,并大致估算出你和景物之间的空间关系。对极几何,就是计算机视觉中用来形式化并精确计算这种“两张照片之间关系”的数学框架。

它的核心目标,就是从两个不同视角拍摄的同一场景的二维图像中,恢复出三维场景的结构以及相机自身的运动。这听起来像是魔法,但背后依赖的是一个非常优雅的数学模型。这个模型的核心,就是本质矩阵。你可以把它理解为一个“加密”的数学对象,它同时编码了两个相机之间的旋转和平移运动(即相机从位置1运动到位置2的刚体变换),并且这个编码与场景的具体三维结构无关。一旦我们解开了这个“加密”的本质矩阵,就能分离出旋转和平移,进而通过三角测量等方法,一步步重建出整个三维世界。

为什么它如此重要?在机器人定位与建图、三维重建、甚至手机上的AR应用中,我们常常只有连续的图像帧,本质矩阵的求解是后续所有三维信息计算的基石。今天,我们就来彻底拆解这个基石——如何从匹配好的图像点对,通过最小二乘的思想,稳健地求解出本质矩阵。我们会深入8点算法这个经典方法的每一个细节,并探讨如何用更鲁棒的Sampson误差来应对现实世界中的噪声。

2. 本质矩阵的数学本质:约束从何而来?

在深入求解之前,我们必须先理解本质矩阵是什么,以及它代表的约束是如何产生的。这决定了我们后续所有算法设计的出发点。

假设我们有两个相机,它们的相机中心分别为 ( O_1 ) 和 ( O_2 )。空间中有一个三维点 ( P ),它在两个相机坐标系下的坐标分别为 ( \mathbf{X}_1 = (X_1, Y_1, Z_1)^T ) 和 ( \mathbf{X}_2 = (X_2, Y_2, Z_2)^T )。这两个坐标通过相机间的刚体运动相关联: [ \mathbf{X}_2 = R \mathbf{X}_1 + \mathbf{t} ] 其中 ( R ) 是一个3x3的旋转矩阵,( \mathbf{t} = (t_x, t_y, t_z)^T ) 是一个平移向量。

现在,点 ( P ) 在两个相机成像平面上的投影,也就是我们在两张图片上看到的像素点(归一化平面坐标,假设相机内参已校正),分别为 ( \mathbf{x}_1 = (x_1, y_1, 1)^T ) 和 ( \mathbf{x}_2 = (x_2, y_2, 1)^T )。它们与三维坐标的关系是: [ \mathbf{X}_1 = \lambda_1 \mathbf{x}_1, \quad \mathbf{X}_2 = \lambda_2 \mathbf{x}_2 ] 这里 ( \lambda_1, \lambda_2 ) 是点的深度(正值)。

将投影关系代入运动关系式,我们有: [ \lambda_2 \mathbf{x}2 = R (\lambda_1 \mathbf{x}1) + \mathbf{t} ] 这个方程同时包含了我们想求的 ( R, \mathbf{t} ) 和我们不知道的深度 ( \lambda_1, \lambda_2 )。为了消去深度,一个关键的技巧是使用向量叉乘。将上式两边同时左乘 ( \mathbf{t} ) 的反对称矩阵 ( [\mathbf{t}]{\times} ): [ \lambda_2 [\mathbf{t}]{\times} \mathbf{x}2 = \lambda_1 [\mathbf{t}]{\times} R \mathbf{x}1 + [\mathbf{t}]{\times} \mathbf{t} ] 由于 ( [\mathbf{t}]{\times} \mathbf{t} = \mathbf{t} \times \mathbf{t} = 0 ),右边第二项为零。得到: [ \lambda_2 [\mathbf{t}]{\times} \mathbf{x}2 = \lambda_1 [\mathbf{t}]{\times} R \mathbf{x}_1 ] 现在,再在上式两边同时左乘 ( \mathbf{x}_2^T ): [ \lambda_2 \mathbf{x}2^T [\mathbf{t}]{\times} \mathbf{x}_2 = \lambda_1 \mathbf{x}2^T [\mathbf{t}]{\times} R \mathbf{x}_1 ] 注意左边:( \mathbf{x}2^T [\mathbf{t}]{\times} \mathbf{x}_2 ) 是一个向量与自身的叉乘点积,结果恒为0。于是我们得到了一个极其简洁的方程: [ \mathbf{x}2^T [\mathbf{t}]{\times} R \mathbf{x}1 = 0 ] 我们定义本质矩阵( E = [\mathbf{t}]{\times} R )。那么上式就写成了对极约束: [ \mathbf{x}_2^T E \mathbf{x}_1 = 0 ]

这个方程就是一切的核心。它意味着,对于任何一对匹配的归一化图像点 ( \mathbf{x}_1 ) 和 ( \mathbf{x}_2 ),它们的坐标必须满足这个齐次线性方程。它神奇地消去了我们未知的深度信息,只留下了关于相机运动 ( R, \mathbf{t} ) 的约束。我们的任务,就是从多对这样的匹配点 ( { (\mathbf{x}_1^i, \mathbf{x}2^i) }{i=1}^n ) 中,把 ( E ) 这个9个元素的矩阵给估计出来。

注意:这里使用的是归一化坐标(内参已去除)。如果给的是原始像素坐标 ( \mathbf{p}_1, \mathbf{p}_2 ),则需要通过已知的相机内参矩阵 ( K ) 进行转换:( \mathbf{x} = K^{-1} \mathbf{p} )。此时约束变为 ( \mathbf{p}_2^T (K^{-T} E K^{-1}) \mathbf{p}_1 = 0 ),我们通常定义基础矩阵 ( F = K^{-T} E K^{-1} )。本文聚焦于 ( E ) 的求解,假设数据已归一化。

3. 经典8点算法:将非线性问题线性化

对极约束 ( \mathbf{x}2^T E \mathbf{x}1 = 0 ) 是一个关于 ( E ) 的元素的线性方程吗?是的,但需要一点变形。让我们把 ( E ) 按行优先展开成一个9维向量: [ \mathbf{e} = [e{11}, e{12}, e_{13}, e_{21}, e_{22}, e_{23}, e_{31}, e_{32}, e_{33}]^T ] 同时,我们把一对点的坐标组合成一个数据向量: [ \mathbf{a} = [x_2 x_1, x_2 y_1, x_2, y_2 x_1, y_2 y_1, y_2, x_1, y_1, 1]^T ] 那么,对极约束可以重写为: [ \mathbf{a}^T \mathbf{e} = 0 ] 看,这变成了一个标准的齐次线性方程。对于每一对匹配点,我们都能得到这样一个方程。

现在,如果我们有 ( n ) 对匹配点,就可以堆叠成一个大矩阵: [ A \mathbf{e} = 0, \quad 其中 A = \begin{bmatrix} \mathbf{a}_1^T \ \mathbf{a}_2^T \ \vdots \ \mathbf{a}_n^T \end{bmatrix} ] 这里 ( A ) 是一个 ( n \times 9 ) 的矩阵。我们的目标是找到一个非零向量 ( \mathbf{e} )(即 ( E )),使得 ( A \mathbf{e} = 0 )。这是一个线性最小二乘问题,更具体地说,是求齐次线性方程组的最小二乘解。

为什么至少需要8个点?矩阵 ( E ) 有9个未知数,但因为它定义在齐次坐标下(乘以任意非零尺度因子 ( k ) 后,约束 ( (k\mathbf{x}_2)^T (kE) (k\mathbf{x}_1) = k^3 (\mathbf{x}_2^T E \mathbf{x}_1) = 0 ) 依然成立),所以其尺度是任意的。我们可以固定其范数,比如令 ( |\mathbf{e}| = 1 )。这样,自由度从9降为8。一个 ( n \times 9 ) 的齐次方程组,当系数矩阵 ( A ) 的秩为8时,有唯一解(在尺度意义下)。因此,理论上至少需要8对不共面的匹配点,使得 ( A ) 的秩为8,从而可以求解出 ( \mathbf{e} )。这就是“8点算法”名称的由来。

3.1 8点算法的具体步骤与数值实现

  1. 数据归一化(至关重要!):这是8点算法能否成功的关键。图像坐标的数值范围(如几百到几千的像素值)直接构造的 ( A ) 矩阵条件数很差,会导致数值不稳定,解严重偏离真实值。标准做法是对每组点集进行归一化:计算所有点的质心,平移至原点;然后计算到原点的平均距离,缩放至 (\sqrt{2})。这个变换用矩阵 ( T ) 表示。对两幅图像的点分别应用变换 ( T_1 ) 和 ( T_2 ),得到归一化坐标 ( \tilde{\mathbf{x}}_1 = T_1 \mathbf{x}_1 ), ( \tilde{\mathbf{x}}_2 = T_2 \mathbf{x}_2 )。

  2. **构造矩阵 ( A ) **:使用归一化后的点坐标 ( { (\tilde{\mathbf{x}}_1^i, \tilde{\mathbf{x}}_2^i) } ),按照 ( \mathbf{a} = [\tilde{x}_2 \tilde{x}_1, \tilde{x}_2 \tilde{y}_1, \tilde{x}_2, \tilde{y}_2 \tilde{x}_1, \tilde{y}_2 \tilde{y}_1, \tilde{y}_2, \tilde{x}_1, \tilde{y}_1, 1]^T ) 的格式,为每一对点构造一行,组成 ( n \times 9 ) 的矩阵 ( A )。

  3. 求解最小二乘问题:我们的目标是 minimize ( | A \mathbf{e} |^2 ), subject to ( | \mathbf{e} | = 1 )。这个约束最小二乘问题的解,就是矩阵 ( A^T A ) 的最小特征值对应的特征向量。在实际数值计算中,更稳健的做法是对 ( A ) 进行奇异值分解:( A = U \Sigma V^T )。那么解 ( \mathbf{e} ) 就是 ( V ) 矩阵的最后一列(对应最小奇异值的那一列)。

  4. 解的反归一化:上一步得到的 ( \mathbf{e} ) 对应的是归一化坐标下的本质矩阵 ( \tilde{E} )。我们需要将其变换回原始坐标空间:( E = T_2^T \tilde{E} T_1 )。

  5. 强制本质矩阵的内在约束:通过上述线性方法得到的 ( E ) 矩阵,虽然满足了对极约束的近似,但它可能并不严格满足本质矩阵的内在几何性质:它的两个非零奇异值应该相等,第三个奇异值为0。这是因为从 ( E = [\mathbf{t}]_{\times} R ) 可以推导出这个性质。因此,我们需要一个“投影”步骤:对求得的 ( E ) 进行SVD分解:( E = U \text{diag}(\sigma_1, \sigma_2, \sigma_3) V^T ),其中 ( \sigma_1 \ge \sigma_2 \ge \sigma_3 )。然后将其替换为最接近的、满足本质矩阵约束的矩阵:( E' = U \text{diag}((\sigma_1+\sigma_2)/2, (\sigma_1+\sigma_2)/2, 0) V^T )。这一步能显著提升解的几何精度。

3.2 8点算法的优势与致命弱点

8点算法的优势在于其简洁和线性。它将一个复杂的多视图几何问题,转化为了一个标准的线性代数问题(SVD求解),概念清晰,实现简单。

然而,它的致命弱点在于对噪声异常敏感。其最小化目标是代数误差 ( | A \mathbf{e} |^2 ),也就是 ( \sum_i (\mathbf{x}_2^{iT} E \mathbf{x}_1^i)^2 )。这个误差没有明确的几何意义。当匹配点对中存在误匹配噪声分布不均匀时,线性方法会平等地对待所有误差,导致解严重偏向于那些噪声大的“坏点”,估计出的 ( E ) 矩阵会严重失真。

在实际应用中,直接使用8点算法,除非你的匹配点精度极高且没有外点,否则结果往往不可用。这就引出了我们需要更鲁棒的估计方法。

4. 从代数误差到几何误差:Sampson误差的降维打击

为了克服8点算法对噪声敏感的缺点,我们需要定义一个更有几何意义的误差。最直观的几何误差是重投影误差:将三维空间点投影到两个像平面上,计算投影点与实测图像点之间的像素距离平方和。但计算重投影误差需要先知道三维点,这本身又依赖于我们要求解的 ( E )(通过三角化),形成了一个鸡生蛋蛋生鸡的循环,求解是一个复杂的非线性优化问题。

Sampson误差提供了一种巧妙的一阶近似。它近似了点到对极线的距离,计算简单,同时比纯代数误差具有强得多的几何意义。

回顾对极约束 ( \mathbf{x}_2^T E \mathbf{x}_1 = 0 )。对于一个给定的、可能带有噪声的测量点对 ( (\hat{\mathbf{x}}_1, \hat{\mathbf{x}}_2) ),它可能不满足约束。Sampson误差要解决的问题是:找到一个最小的扰动 ( (\delta \mathbf{x}_1, \delta \mathbf{x}_2) ),使得扰动后的点 ( (\hat{\mathbf{x}}_1 + \delta \mathbf{x}_1, \hat{\mathbf{x}}_2 + \delta \mathbf{x}_2) ) 恰好满足对极约束,并且最小化扰动的大小 ( |\delta \mathbf{x}_1|^2 + |\delta \mathbf{x}_2|^2 )。

设函数 ( F(\mathbf{x}_1, \mathbf{x}_2) = \mathbf{x}_2^T E \mathbf{x}_1 )。对于测量点 ( (\hat{\mathbf{x}}_1, \hat{\mathbf{x}}_2) ),其函数值 ( F(\hat{\mathbf{x}}_1, \hat{\mathbf{x}}_2) = C )(通常不为零)。我们希望找到增量 ( (\delta \mathbf{x}_1, \delta \mathbf{x}_2) ) 使得 ( F(\hat{\mathbf{x}}_1 + \delta \mathbf{x}_1, \hat{\mathbf{x}}_2 + \delta \mathbf{x}_2) = 0 )。进行一阶泰勒展开: [ F(\hat{\mathbf{x}}_1 + \delta \mathbf{x}_1, \hat{\mathbf{x}}_2 + \delta \mathbf{x}_2) \approx F(\hat{\mathbf{x}}_1, \hat{\mathbf{x}}_2) + \frac{\partial F}{\partial \mathbf{x}_1} \delta \mathbf{x}_1 + \frac{\partial F}{\partial \mathbf{x}_2} \delta \mathbf{x}_2 = 0 ] 其中,雅可比矩阵很容易计算: [ \frac{\partial F}{\partial \mathbf{x}_1} = \mathbf{x}_2^T E, \quad \frac{\partial F}{\partial \mathbf{x}_2} = \mathbf{x}_1^T E^T ] 为了书写方便,令 ( J = [J_1, J_2] = [\mathbf{x}_2^T E, \mathbf{x}_1^T E^T] ), ( \delta \mathbf{x} = [\delta \mathbf{x}_1^T, \delta \mathbf{x}2^T]^T )。那么一阶条件为: [ C + J \delta \mathbf{x} = 0 ] 我们的优化目标是: [ \min{\delta \mathbf{x}} | \delta \mathbf{x} |^2 \quad \text{s.t.} \quad C + J \delta \mathbf{x} = 0 ] 这是一个带线性等式约束的二次优化问题,可以用拉格朗日乘子法求解。其解析解为: [ \delta \mathbf{x} = -\frac{C}{J J^T} J^T ] 而最优目标函数值,即Sampson误差的平方,就是: [ \epsilon_s^2 = | \delta \mathbf{x} |^2 = \frac{C^2}{J J^T} = \frac{(\mathbf{x}_2^T E \mathbf{x}_1)^2}{(E \mathbf{x}_1)_1^2 + (E \mathbf{x}_1)_2^2 + (E^T \mathbf{x}_2)_1^2 + (E^T \mathbf{x}_2)_2^2} ] 这里 ( (E \mathbf{x}_1)_1 ) 表示向量 ( E \mathbf{x}_1 ) 的第一个元素(x分量),( (E \mathbf{x}_1)_2 ) 表示第二个元素(y分量)。分母中的两项 ( (E \mathbf{x}_1)_1^2 + (E \mathbf{x}_1)_2^2 ) 实际上是点 ( \mathbf{x}_1 ) 到第二幅图像对极线的距离的平方的系数(差一个尺度因子),类似地,后两项是点 ( \mathbf{x}_2 ) 到第一幅图像对极线的距离的系数。因此,Sampson误差可以理解为点到对极线距离的一种加权调和平均,它比单纯的代数误差 ( C^2 ) 具有更清晰的几何解释。

4.1 基于Sampson误差的非线性优化

现在,我们的目标不再是最小化代数误差 ( \sum_i (\mathbf{x}2^{iT} E \mathbf{x}1^i)^2 ),而是最小化几何意义更强的Sampson误差平方和: [ \min{E} \sum{i=1}^{n} \frac{(\mathbf{x}_2^{iT} E \mathbf{x}_1^i)^2}{(E \mathbf{x}_1^i)_1^2 + (E \mathbf{x}_1^i)_2^2 + (E^T \mathbf{x}_2^i)_1^2 + (E^T \mathbf{x}_2^i)_2^2} ] 这是一个关于 ( E ) 的9个参数的非线性最小二乘问题。虽然比线性问题复杂,但现代优化库(如Ceres Solver, g2o, 或SciPy)可以高效求解。

标准的求解流程如下:

  1. 鲁棒初始化:不要直接用8点算法的结果。先使用RANSAC框架。在RANSAC的每次迭代中,随机抽取8对点,用8点算法计算一个 ( E ) 矩阵,然后用这个 ( E ) 计算所有点的Sampson误差。将误差小于某个阈值(例如,与内点标准差相关)的点标记为内点。迭代多次后,选择内点数量最多的那个 ( E ) 作为初始解。同时,我们也得到了一个可靠的内点集合

  2. 非线性优化:以上一步RANSAC得到的内点集合和对应的 ( E ) 矩阵初始值为起点,构建非线性最小二乘问题,最小化所有内点的Sampson误差平方和。优化变量就是 ( E ) 的9个元素。由于本质矩阵有尺度模糊性,在优化时需要添加一个约束,例如固定 ( |E|F = 1 )(Frobenius范数),或者直接使用李代数参数化(将 ( E ) 表示为 ( [\mathbf{t}]{\times} R ) 的形式,优化旋转和平移的6个参数)。

  3. 强制奇异值约束:优化完成后,得到的 ( E ) 矩阵可能仍然不严格满足两个奇异值相等的约束。因此,最后一步通常还是像8点算法那样,对优化后的 ( E ) 进行SVD分解,并投影到最接近的、满足 ( \Sigma = \text{diag}(\sigma, \sigma, 0) ) 的矩阵上。

这套“RANSAC(8点法初筛)+ 非线性优化(Sampson误差)”的组合拳,是实践中求解本质矩阵的黄金标准。它既利用了线性方法的快速来在RANSAC中高效采样,又通过非线性优化在干净的内点集上获得了几何最优的解,对噪声和误匹配的鲁棒性极强。

5. 实操中的关键细节与常见陷阱

理论很完美,但一上手就掉坑。下面分享几个我从实际项目中总结出来的关键细节和避坑指南。

5.1 坐标归一化:不是可选项,是必选项

我见过太多人跳过归一化,结果解出来的 ( E ) 完全不对,还以为是算法本身的问题。归一化的目的不仅仅是提高数值稳定性,它还能使误差项具有一致的物理量纲。想象一下,如果你的x坐标范围是[0, 1920],y坐标范围是[0, 1080],那么构造的 ( A ) 矩阵中,与x相关的项(如 ( x_2 x_1 ))数量级约为 ( 10^6 ),而与常数项1相关的项数量级为1。这会导致矩阵条件数巨大,SVD求解时,微小的噪声就会在最小奇异值对应的特征向量(我们的解)上产生巨大扰动。

正确的归一化做法

  • 对第一幅图的所有点 ( {\mathbf{x}_1^i} ):计算均值 ( \mu_1 = \frac{1}{n}\sum \mathbf{x}_1^i ),将所有点平移使其均值为零:( \mathbf{x}_1^{'} = \mathbf{x}_1 - \mu_1 )。
  • 计算这些平移后点的平均距离(到原点):( d_1 = \frac{1}{n}\sum |\mathbf{x}_1^{'}| )。
  • 计算缩放因子 ( s_1 = \sqrt{2} / d_1 )。
  • 构造归一化变换矩阵:( T_1 = \begin{bmatrix} s_1 & 0 & -s_1\mu_{1x} \ 0 & s_1 & -s_1\mu_{1y} \ 0 & 0 & 1 \end{bmatrix} )。
  • 对第二幅图的点进行同样的操作,得到 ( T_2 )。
  • 所有计算在归一化坐标 ( \tilde{\mathbf{x}}_1 = T_1 \mathbf{x}_1 ), ( \tilde{\mathbf{x}}_2 = T_2 \mathbf{x}_2 ) 下进行。
  • 最终解需要反变换:( E = T_2^T \tilde{E} T_1 )。

5.2 特征值分解 vs. 奇异值分解:选SVD

在求解 ( \min |A\mathbf{e}|^2, \text{s.t.} |\mathbf{e}|=1 ) 时,理论上解是 ( A^T A ) 的最小特征值对应的特征向量。但在数值计算上,直接对 ( A ) 进行SVD(( A = U\Sigma V^T ))比先计算 ( A^T A ) 再特征值分解要稳定得多。这是因为计算 ( A^T A ) 会放大矩阵的条件数(条件数平方),如果 ( A ) 本身已经接近病态,( A^T A ) 会使其更糟,导致特征向量求解不准确。SVD直接处理 ( A ),数值精度更高。记住,在数值线性代数中,能用SVD就别用特征值分解

5.3 从本质矩阵E分解出R和t:四重歧义

假设我们通过上述方法得到了一个满足约束的 ( E ) 矩阵。通过SVD分解 ( E = U \text{diag}(\sigma, \sigma, 0) V^T ),可以恢复出 ( R ) 和 ( t )。但这里存在四重歧义

定义两个特殊的矩阵: [ W = \begin{bmatrix} 0 & -1 & 0 \ 1 & 0 & 0 \ 0 & 0 & 1 \end{bmatrix}, \quad Z = \begin{bmatrix} 0 & 1 & 0 \ -1 & 0 & 0 \ 0 & 0 & 0 \end{bmatrix} ] 可以验证,( [\mathbf{t}]{\times} = U Z U^T ) 和 ( [\mathbf{t}]{\times} = U (-Z) U^T ) 都成立。通常,我们取 ( \mathbf{t} ) 为 ( U ) 的第三列(对应奇异值0的右奇异向量),即 ( \mathbf{t} \sim u_3 ) 或 ( \mathbf{t} \sim -u_3 )。旋转矩阵 ( R ) 有两种可能: [ R_1 = U W V^T, \quad R_2 = U W^T V^T ] 因此,组合起来有四种可能的 ( (R, \mathbf{t}) ):( (R_1, u_3) ), ( (R_1, -u_3) ), ( (R_2, u_3) ), ( (R_2, -u_3) )。

如何确定唯一正确的解?必须依赖场景的深度为正这一物理约束。对于任意一对匹配点,我们可以尝试用这四组 ( (R, \mathbf{t}) ) 分别进行三角化,恢复该点的三维坐标。检查该点在两个相机坐标系下的深度(Z坐标)。只有唯一的一组 ( (R, \mathbf{t}) ) 能使得大多数点的深度在两个相机下都为正。选择这一组作为最终解。

5.4 匹配点质量与RANSAC参数设置

算法的上限由输入数据决定。如果特征匹配本身错误百出,再好的算法也无力回天。使用SIFT、ORB等特征时,务必先用比率测试(如Lowe's ratio test)或交叉验证进行初步筛选。

在RANSAC阶段:

  • 距离阈值:这个阈值决定了多大Sampson误差的点算作内点。一个经验法则是,如果坐标已经归一化(均值为0,平均距离 (\sqrt{2})),阈值可以设为 ( 3.84 \sigma^2 )(对于95%置信度的卡方分布,自由度为1)。( \sigma ) 是像素测量误差,通常设为1-2个像素(在归一化坐标下,这个值会很小,比如0.01-0.02)。可以先设一个较小的值(如0.01),根据内点数量调整。
  • 迭代次数:RANSAC所需迭代次数 ( k = \frac{\log(1-p)}{\log(1 - w^n)} ),其中 ( p ) 是置信度(如0.99),( w ) 是内点比例(可先乐观估计,如0.5),( n ) 是每次采样所需最小数据量(这里是8)。如果内点率低,所需迭代次数会指数级增长。在实际中,可以设定一个最大迭代次数(如2000)作为上限。
  • 动态调整迭代次数:一种更好的策略是动态调整。在RANSAC运行过程中,如果发现了一个更好的模型(内点更多),就用当前的最佳内点率 ( w ) 重新计算所需的迭代次数 ( k )。如果当前已迭代次数超过 ( k ),就可以提前终止,节省时间。

6. 超越8点与Sampson:更现代的求解思路

虽然“8点法+RANSAC+非线性优化”是主流,但在一些极端场景下,我们还可以考虑更进一步的优化。

6.1 使用更少的点:5点算法

在已知相机内参的情况下(这是常态),本质矩阵只有5个自由度(旋转3个,平移方向2个,因为平移的尺度无法确定)。因此,理论上5对匹配点就可以确定 ( E )。5点算法比8点算法更复杂,需要求解一个10次多项式方程,并从中筛选出实数解。它的主要优势在于需要更少的点,在特征点稀疏的场景下可能更有用,并且由于使用了更精确的自由度模型,可能对噪声更鲁棒。OpenCV的findEssentialMat函数中就提供了5点法的选项。但它的计算复杂度高于8点法,实现也更繁琐。我的建议是:在特征点充足(>15对)的情况下,优先使用鲁棒化的8点法;在点非常少且质量很高时,可以尝试5点法。

6.2 将本质矩阵求解纳入全局BA

在完整的SLAM或SfM流程中,本质矩阵的估计通常只是一个初始化步骤。我们最终的目标是优化所有相机位姿和三维点坐标,即集束调整。因此,一个更彻底的做法是,不单独优化 ( E ),而是将这一步作为初始化,快速得到一个相机位姿和稀疏点云的初始估计,然后立即进行局部BA。在BA中,优化的目标就是重投影误差,这是最几何、最优的误差指标。BA会同时调整位姿和点坐标,使得整体重投影误差最小。这比单独优化 ( E ) 更为精确,因为它解除了对极几何中的一阶近似假设,并且能处理多个视图的信息。

6.3 利用非连续帧与惯性测量单元融合

在机器人或AR/VR应用中,图像帧率很高,连续帧之间的平移量很小,导致本质矩阵的病态(特别是平移向量 ( t ) 接近零时,( [t]_{\times} ) 接近零矩阵,( E ) 的秩下降)。此时,对极几何约束变弱,估计结果极不可靠。解决方法有两种:

  1. 使用非连续帧:跳过几帧,使用间隔较远的帧进行匹配。这样基线(baseline)变大,平移量更显著,估计更稳定。
  2. 与IMU融合:IMU可以提供短时间内的相对旋转信息,而且非常准确。我们可以用IMU数据初始化或约束旋转矩阵 ( R ),从而将问题简化为主要估计平移方向 ( t ),这大大降低了问题的难度和歧义性。这是现代视觉惯性里程计的标准做法。

求解本质矩阵是连接二维图像与三维世界的第一把钥匙。从线性的8点法到基于Sampson误差的非线性优化,再到与RANSAC的结合,每一步都充满了工程上的权衡与技巧。理解其背后的几何原理,能帮助你在调试算法、分析失败案例时找到正确的方向。记住,没有放之四海而皆准的参数,理解原理后,根据你的具体数据(噪声水平、匹配精度、场景类型)进行调优,才是工程实践的精髓。在实际项目中,我通常会准备一个可视化工具,将估计出的对极线画在图像上,直观地检查内点的分布和误差情况,这比任何数值指标都更能快速定位问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询