
1. 对极几何与本质矩阵从三维世界到二维图像的几何约束在计算机视觉特别是三维重建和立体视觉领域我们常常需要回答一个核心问题如何从两张不同视角拍摄的同一场景的图片中恢复出相机在三维空间中的运动乃至场景的三维结构对极几何Epipolar Geometry就是解决这个问题的数学基石而本质矩阵Essential Matrix则是这个几何关系最精炼的代数表达。简单来说它封装了两个相机之间的旋转和平移关系不依赖于场景的具体内容只与相机自身的运动有关。理解并求解本质矩阵是通往三维视觉世界的关键一步。想象一下你站在一个房间里用手机拍了一张照片然后向左移动几步再拍一张。这两张照片中同一个物体比如一盏台灯在图像上的位置发生了变化。对极几何描述的就是这种位置变化的规律。本质矩阵就是这个规律的数学“密码本”。一旦我们解开了这个密码本就能推断出你向左移动了多少距离、旋转了多少角度进而可以计算出房间里每个点在三维空间中的位置。这个过程就是视觉里程计Visual Odometry、SLAMSimultaneous Localization and Mapping和三维重建的核心。本文将从原理出发详细拆解对极几何的约束关系并深入探讨求解本质矩阵的多种经典方法及其背后的数学原理、实现细节和实际应用中的坑点目标是让你不仅能看懂公式更能亲手实现并理解其每一个细节。2. 对极几何原理深度解析从物理直觉到数学公式2.1 核心概念与物理模型建立要理解本质矩阵我们必须先构建清晰的物理和数学模型。假设有两个相机分别称为相机1参考帧和相机2。设相机1的光心为 (O_1)相机2的光心为 (O_2)。三维空间中的一个点 (P) 在世界坐标系中它在相机1和相机2的成像平面上的投影点分别为 (p_1) 和 (p_2)对应的归一化平面坐标即相机坐标系下的坐标Z1的平面分别为 (\mathbf{x}_1 [u_1, v_1, 1]^T) 和 (\mathbf{x}_2 [u_2, v_2, 1]^T)。这里的关键在于点 (P)、两个相机光心 (O_1) 和 (O_2) 这三者必然共面。这个平面被称为极平面Epipolar Plane。连接两个光心的直线 (O_1O_2) 称为基线Baseline。基线与两个成像平面的交点 (e_1) 和 (e_2) 称为极点Epipole。极平面与成像平面的交线称为极线Epipolar Line。对于左图相机1上的任何一个点 (p_1)其在右图相机2上的对应点 (p_2) 必然位于一条特定的极线上这条极线就是极平面与右成像平面的交线。这就是对极约束Epipolar Constraint它极大地缩小了寻找匹配点的搜索范围从整幅图像缩小到一条直线上。2.2 本质矩阵的数学推导现在我们用数学语言来描述这个约束。设从相机1到相机2的刚体变换为旋转矩阵 (\mathbf{R}) 和平移向量 (\mathbf{t})。那么点 (P) 在两个相机坐标系下的坐标 (\mathbf{X}_1) 和 (\mathbf{X}2) 满足 [ \mathbf{X}2 \mathbf{R} \mathbf{X}1 \mathbf{t} ] 同时我们知道归一化坐标 (\mathbf{x}) 与相机坐标系下的坐标 (\mathbf{X}) 只差一个深度 (\lambda)即 (\mathbf{X} \lambda \mathbf{x})。因此有 [ \lambda_2 \mathbf{x}2 \mathbf{R} (\lambda_1 \mathbf{x}1) \mathbf{t} ] 为了消去深度信息我们对等式两边同时左乘 (\mathbf{t}) 的反对称矩阵 ([\mathbf{t}]{\times})。反对称矩阵的性质是对于任意向量 (\mathbf{a})有 ([\mathbf{t}]{\times} \mathbf{a} \mathbf{t} \times \mathbf{a})向量叉乘。于是 [ \lambda_2 [\mathbf{t}]{\times} \mathbf{x}2 [\mathbf{t}]{\times} \mathbf{R} (\lambda_1 \mathbf{x}1) [\mathbf{t}]{\times} \mathbf{t} ] 由于任何向量与自身的叉乘为零即 ([\mathbf{t}]{\times} \mathbf{t} \mathbf{0})所以上式简化为 [ \lambda_2 [\mathbf{t}]{\times} \mathbf{x}2 \lambda_1 [\mathbf{t}]{\times} \mathbf{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} \mathbf{R} \mathbf{x}_1 ] 注意等式左边(\mathbf{x}2^T [\mathbf{t}]{\times} \mathbf{x}_2) 是一个标量它等于 (\mathbf{x}_2 \cdot (\mathbf{t} \times \mathbf{x}_2))。根据向量混合积的性质三个向量中两个相同其混合积为零。因此左边恒等于0。于是我们得到 [ \mathbf{x}2^T [\mathbf{t}]{\times} \mathbf{R} \mathbf{x}1 0 ] 这就是著名的对极约束方程。我们定义本质矩阵 (\mathbf{E}) 为 [ \mathbf{E} [\mathbf{t}]{\times} \mathbf{R} ] 那么对极约束可以简洁地写为 [ \mathbf{x}_2^T \mathbf{E} \mathbf{x}_1 0 ] 这个方程就是连接两幅图像对应点的桥梁。本质矩阵 (\mathbf{E}) 是一个3x3的矩阵它仅由两个相机之间的相对运动 (\mathbf{R}) 和 (\mathbf{t}) 决定与场景结构无关。它有两个重要的性质1) 奇异性它的秩为22) 它的两个非零奇异值相等。这两个性质将在后续的求解和分解中起到关键的约束作用。注意这里使用的是归一化平面坐标而不是像素坐标。如果使用像素坐标 (\mathbf{p} K \mathbf{x})其中 (K) 是相机内参矩阵那么对极约束变为 (\mathbf{p}_2^T K^{-T} \mathbf{E} K^{-1} \mathbf{p}_1 0)。我们定义基础矩阵Fundamental Matrix(\mathbf{F} K^{-T} \mathbf{E} K^{-1})则约束为 (\mathbf{p}_2^T \mathbf{F} \mathbf{p}_1 0)。本质矩阵与基础矩阵的核心区别在于是否已知相机内参。本文聚焦于已知内参下的本质矩阵求解这是更常见且更稳定的情况。3. 本质矩阵求解的经典算法从理论到实现有了对极约束方程我们的任务就是给定至少5对理论上或8对实践中更常用匹配好的归一化坐标点对 ({(\mathbf{x}_1^i, \mathbf{x}2^i)}{i1}^n)求解满足 (\mathbf{x}_2^{iT} \mathbf{E} \mathbf{x}_1^i 0) 的矩阵 (\mathbf{E})。下面介绍几种最核心的求解方法。3.1 八点法最直观的线性求解八点法Eight-Point Algorithm是求解本质矩阵最著名、最基础的方法。虽然名为“八点”但它需要至少8对匹配点来得到一个线性解。我们将对极约束方程展开 设 (\mathbf{x}1 [u_1, v_1, 1]^T) (\mathbf{x}2 [u_2, v_2, 1]^T) (\mathbf{E} \begin{bmatrix} e{11} e{12} e_{13} \ e_{21} e_{22} e_{23} \ e_{31} e_{32} e_{33} \end{bmatrix})。 则约束方程展开为 [ [u_2, v_2, 1] \begin{bmatrix} e_{11} e_{12} e_{13} \ e_{21} e_{22} e_{23} \ e_{31} e_{32} e_{33} \end{bmatrix} \begin{bmatrix} u_1 \ v_1 \ 1 \end{bmatrix} 0 ] 展开后得到一个关于 (\mathbf{E}) 9个元素的线性方程 [ u_2 u_1 e_{11} u_2 v_1 e_{12} u_2 e_{13} v_2 u_1 e_{21} v_2 v_1 e_{22} v_2 e_{23} u_1 e_{31} v_1 e_{32} e_{33} 0 ] 对于第 (i) 对点我们可以将其写成向量形式 [ \mathbf{a}^i \cdot \mathbf{e} 0 ] 其中 (\mathbf{e} [e_{11}, e_{12}, e_{13}, e_{21}, e_{22}, e_{23}, e_{31}, e_{32}, e_{33}]^T) 是将 (\mathbf{E}) 按行堆叠成的9维向量(\mathbf{a}^i [u_2^i u_1^i, u_2^i v_1^i, u_2^i, v_2^i u_1^i, v_2^i v_1^i, v_2^i, u_1^i, v_1^i, 1]^T)。当我们有 (n \geq 8) 对匹配点时我们可以构建一个 (n \times 9) 的矩阵 (\mathbf{A})每一行是 (\mathbf{a}^{iT})。那么问题转化为求解线性方程组 [ \mathbf{A} \mathbf{e} \mathbf{0} ] 这是一个齐次线性方程组。我们需要在 (|\mathbf{e}| 1) 的约束下避免零解求 (\mathbf{A}) 的零空间。这通过对矩阵 (\mathbf{A}) 进行奇异值分解SVD来实现(\mathbf{A} \mathbf{U} \mathbf{\Sigma} \mathbf{V}^T)。解 (\mathbf{e}) 就是 (\mathbf{V}) 的最后一列对应最小奇异值的右奇异向量。将其重新排列成3x3矩阵就得到了初始的本质矩阵估计 (\mathbf{E}_{est})。实操要点与坑点归一化至关重要直接使用像素坐标或归一化坐标构建的 (\mathbf{A}) 矩阵其元素数量级可能差异巨大例如(u_2 u_1) 可能远大于1导致数值不稳定SVD求解误差大。必须进行数据归一化。通常做法是计算所有点 (\mathbf{x}_1^i) 的质心平移使其质心位于原点然后缩放使其到原点的平均距离为 (\sqrt{2})。对 (\mathbf{x}2^i) 进行同样的变换。用归一化后的坐标构建 (\mathbf{A}) 求解得到 (\mathbf{E}{norm})最后再通过变换矩阵反归一化得到真正的本质矩阵(\mathbf{E} \mathbf{T}2^T \mathbf{E}{norm} \mathbf{T}_1)。这一步是八点法成功的基石很多初学者忽略它导致结果完全不可用。满足本质矩阵的约束通过上述线性方法求得的 (\mathbf{E}{est}) 通常不满足本质矩阵的秩为2且两个非零奇异值相等的内在约束。因此我们需要进行强制约束。对 (\mathbf{E}{est}) 进行SVD分解(\mathbf{E}_{est} \mathbf{U} \text{diag}(\sigma_1, \sigma_2, \sigma_3) \mathbf{V}^T)其中 (\sigma_1 \geq \sigma_2 \geq \sigma_3)。一个真正的本质矩阵其奇异值应满足 ([\sigma, \sigma, 0]) 的形式。因此我们将奇异值矩阵替换为 (\text{diag}((\sigma_1\sigma_2)/2, (\sigma_1\sigma_2)/2, 0))然后重构本质矩阵(\mathbf{E} \mathbf{U} \text{diag}(1, 1, 0) \mathbf{V}^T)更常见的做法是直接设两个非零奇异值为1。注意由于符号和旋转的不确定性(\mathbf{V}^T) 有时需要调整确保重构的 (\mathbf{E}) 满足对极约束。3.2 五点法最少的点数与更高的复杂度八点法简单稳定但它使用了最小二乘没有考虑本质矩阵更严格的内部约束行列式为0两个非零奇异值相等这可能导致在噪声下或存在误匹配时解偏离真实的流形。从自由度来看本质矩阵有5个自由度旋转3个平移方向2个平移尺度无法确定。因此理论上最少只需要5对点就可以求解。五点法由David Nistér在其经典论文《An efficient solution to the five-point relative pose problem》中提出。该方法将本质矩阵的9个元素用5个未知参数表示并将对极约束方程代入得到一个10阶的多项式方程组因为每个点对提供一个方程5个点提供5个方程但本质矩阵有9个元素利用其性质可化简。通过巧妙的数学变换如利用矩阵的秩约束可以将问题转化为求解一个10次多项式的实根。对于每个实根可以反解出一组可能的 (\mathbf{R}) 和 (\mathbf{t})最多10组解然后通过将第三个点进行三角化并检查其深度为正位于相机前方来选出唯一正确的解。实操心得五点法在精确匹配点较少恰好5-7对且匹配质量极高时理论上比八点法更精确因为它严格遵循了本质矩阵的约束。但是其实现复杂度远高于八点法涉及结式消元、多项式求根等数值计算稳定性需要仔细处理。在实际应用中除非对点数有严格限制如视觉里程计中特征点很少的帧否则更常用的策略是使用RANSAC随机采样一致性框架配合八点法或五点法作为内点模型估计器。例如OpenCV中的findEssentialMat函数就提供了RANSAC、LMEDS等方法选项其内部模型求解可以是八点法或五点法。3.3 基于RANSAC的鲁棒估计应对误匹配的实战利器在实际的图像中我们通过特征匹配如SIFT, ORB, SURF得到的点对总是包含大量的误匹配外点。直接使用所有点进行八点法或五点法求解会得到一个被外点严重污染的错误结果。RANSAC是解决这个问题的标准且几乎必不可少的方法。RANSACRandom Sample Consensus流程如下随机采样从所有匹配点对中随机抽取最小样本集对于八点法是8对对于五点法是5对。模型估计用这个最小样本集通过八点法或五点法计算出一个本质矩阵 (\mathbf{E}) 的假设。模型验证用计算出的 (\mathbf{E}) 去测试所有匹配点对。计算每个点对的对称极线距离Sampson距离或重投影误差。如果距离小于某个设定的阈值例如对于归一化坐标阈值可设为0.001到0.01则认为该点对是当前假设模型的内点inlier。迭代与选择重复步骤1-3很多次迭代次数由内点比例估计。最终选择那个拥有最多内点数的模型假设。精优化利用最终选出的所有内点用八点法或使用非线性优化重新估计一个更精确的本质矩阵。关键参数设置经验迭代次数通常不是固定值而是动态计算。公式为 (N \frac{\log(1-p)}{\log(1-w^m)})其中 (p) 是期望置信度如0.99(w) 是估计的内点比例初始可设为0.5运行时更新(m) 是最小样本集大小8或5。实践中我们会设置一个最大迭代次数上限如2000。距离阈值这是最影响结果的一个参数。它需要根据你数据的噪声水平来设定。对于归一化坐标一个经验值是0.001到0.01。你可以通过计算所有点对在一个“理想”模型下的平均误差来粗略估计。阈值设得太松会纳入外点导致模型不准设得太紧则可能找不到足够内点模型失败。最小内点数可以设定一个可接受模型所需的最小内点数量例如总点数的20%-30%。注意RANSAC找到的只是内点集和一个由内点集线性估计的模型。这个模型通常还可以通过非线性优化进一步精化。例如以内点集的对极几何距离Sampson误差之和为目标函数以本质矩阵的参数或其对应的旋转和平移为优化变量使用列文伯格-马夸尔特Levenberg-Marquardt算法进行迭代优化可以得到在最大似然意义下更优的解。4. 从本质矩阵分解到运动参数恢复R和t求解出本质矩阵 (\mathbf{E}) 后我们的最终目标是恢复出相机间的相对运动旋转矩阵 (\mathbf{R}) 和平移向量 (\mathbf{t})的方向。这个过程称为本质矩阵的分解。4.1 SVD分解法对求得的本质矩阵 (\mathbf{E}) 进行奇异值分解SVD [ \mathbf{E} \mathbf{U} \text{diag}(\sigma, \sigma, 0) \mathbf{V}^T ] 其中我们已通过之前的强制约束使得前两个奇异值相等 ((\sigma))第三个为0。存在四种可能的 ((\mathbf{R}, \mathbf{t})) 组合 [ \begin{aligned} \mathbf{R}_1 \mathbf{U} \mathbf{W} \mathbf{V}^T, \quad \mathbf{t}_1 \mathbf{u}_3 \ \mathbf{R}_2 \mathbf{U} \mathbf{W} \mathbf{V}^T, \quad \mathbf{t}_2 -\mathbf{u}_3 \ \mathbf{R}_3 \mathbf{U} \mathbf{W}^T \mathbf{V}^T, \quad \mathbf{t}_3 \mathbf{u}_3 \ \mathbf{R}_4 \mathbf{U} \mathbf{W}^T \mathbf{V}^T, \quad \mathbf{t}_4 -\mathbf{u}_3 \end{aligned} ] 其中(\mathbf{u}3) 是 (\mathbf{U}) 的第三列(\mathbf{W}) 是一个特定的正交矩阵 [ \mathbf{W} \begin{bmatrix} 0 -1 0 \ 1 0 0 \ 0 0 1 \end{bmatrix} ]为什么是四种组合这源于两个模糊性1) 平移向量的符号模糊(\mathbf{t}) 和 (-\mathbf{t}) 在本质矩阵中产生相同的 ([\mathbf{t}]{\times})因为反对称矩阵是奇异的2) 旋转的模糊性与 (\mathbf{W}) 和 (\mathbf{W}^T) 有关对应着绕基线旋转180度的两种可能。4.2 通过三角化验证选择正确解如何从这四组解中选出唯一正确的一组我们需要利用三维空间点的深度必须为正位于相机前方这一物理约束。具体步骤如下对于每一组 ((\mathbf{R}_i, \mathbf{t}_i))选择一对匹配点通常用内点中置信度最高的一对。利用该对点通过三角化方法如最小二乘法求解线性方程或SVD方法计算对应的三维点 (P) 在第一个相机坐标系下的坐标。检查该三维点 (P) 在两个相机坐标系下的深度即Z坐标在相机1坐标系下深度 (depth_1 Z_1 0)在相机2坐标系下坐标 (P_2 \mathbf{R}_i P_1 \mathbf{t}_i)深度 (depth_2 Z_2 0)唯一能使该点同时在两个相机前方深度为正的那组 ((\mathbf{R}_i, \mathbf{t}_i)) 就是正确的解。实操细节通常只需要用一对正确的匹配点就能确定。但为了稳健可以多用几对点比如10对进行验证选择那个使最多点对满足正深度约束的解。三角化本身也有误差特别是当点接近极线时三角化结果很不稳定。因此最好选择视差两个观测方向夹角较大的点对进行验证这样的三角化结果更可靠。最终恢复的平移向量 (\mathbf{t}) 是单位向量因为它只表示了方向。平移的尺度是无法从单目对极几何中恢复的这就是所谓的尺度不确定性。要恢复真实尺度需要额外的信息例如已知场景中某物体的实际尺寸或通过其他传感器如IMU、轮速计提供。5. 实战全流程、常见问题与性能优化5.1 完整实战流程梳理结合以上所有内容一个鲁棒的本质矩阵求解与运动恢复的完整流程如下特征提取与匹配对两幅图像分别提取特征点如ORB, SIFT并进行特征描述子匹配得到初始匹配点对列表matches。坐标转换根据相机内参矩阵 (K)将所有匹配点的像素坐标 (\mathbf{p}) 转换为归一化平面坐标 (\mathbf{x} K^{-1} \mathbf{p})。RANSAC估计本质矩阵 a. 设置RANSAC参数迭代次数、距离阈值、最小内点数。 b. 循环迭代随机抽取8对点 - 使用归一化八点法计算E_hypothesis- 强制本质矩阵约束 - 计算所有点对的极线距离统计内点。 c. 选择内点最多的模型作为初步结果E_ransac并记录所有内点。非线性优化可选但推荐以内点集的对极几何误差如Sampson误差之和为目标将E_ransac作为初值使用LM算法进行非线性优化得到更精确的E_optimized。分解本质矩阵对E_optimized进行SVD分解得到四组可能的 ((\mathbf{R}, \mathbf{t}))。三角化验证使用多对高质量内点对每组运动假设进行三角化并检查正深度选出唯一正确的旋转矩阵 (\mathbf{R}) 和平移方向 (\mathbf{t}_{dir})单位向量。输出输出正确的 (\mathbf{R}) 和 (\mathbf{t}_{dir})以及最终的内点集。至此两帧图像间的相对运动缺尺度已恢复。5.2 常见问题、陷阱与排查技巧即使理解了原理和流程在实际编码中依然会踩很多坑。下面是一些典型问题及解决方案问题1求解的本质矩阵分解出的运动结果完全错误旋转和平离奇。排查点1坐标系统一了吗确保两幅图像的特征点都使用相同的相机内参转换到了归一化平面。内参矩阵 (K) 输入错误是最常见的低级错误。排查点2数据归一化做了吗在八点法构建矩阵 (\mathbf{A}) 之前是否对归一化坐标进行了平移和缩放归一化没做这一步结果几乎必然发散。排查点3匹配点质量如何初始匹配可能包含大量误匹配。检查特征匹配的步骤考虑使用交叉验证、比率测试如Lowes ratio test或基于描述子距离的阈值来过滤掉明显不可靠的匹配。排查点4RANSAC阈值合理吗阈值设置不当会导致内点集包含外点或有效内点被排除。可以尝试绘制匹配点对的极线距离直方图观察距离分布据此设置阈值。问题2三角化验证时四组解中有多组甚至全部都能使某些点深度为正。原因与解决这通常发生在场景点共面或近似共面或者相机只有旋转没有平移纯旋转的情况下。对极几何在纯旋转或场景为平面时会发生退化本质矩阵的秩会发生变化导致求解和分解不稳定。纯旋转此时平移向量 (\mathbf{t}) 为零向量本质矩阵退化为一个反对称矩阵与旋转矩阵的乘积其秩不再为2。八点法会失效。需要检测这种退化情况并改用单应性矩阵Homography来估计运动。共面场景同样部分场景下单应性矩阵模型可能比本质矩阵更合适。实践中可以同时计算本质矩阵和单应性矩阵的内点数量选择内点更多的模型。问题3恢复的运动尺度飘忽不定相邻帧间尺度不一致。根本原因单目对极几何固有的尺度不确定性。我们恢复的平移 (\mathbf{t}) 是单位向量。解决方案在视觉里程计或SLAM中需要通过其他方式确定尺度。初始化在系统启动时假设第一对关键帧之间的平移为单位长度以此为尺度基准。融合后续通过三角化出的三维点在局部或全局进行Bundle Adjustment优化时尺度会逐渐收敛并保持一致。传感器融合引入IMU通过加速度计的双重积分提供绝对尺度信息这是目前VIO视觉惯性里程计的标准做法。问题4在特征点分布不均匀或集中于图像某一部分时结果很差。原因点分布不均会导致求解的几何模型对图像其他区域泛化能力差。例如所有匹配点都来自图像左上角的一堵墙。技巧在RANSAC采样或最终的内点选择中可以加入空间分布约束。例如将图像划分为网格确保从每个网格中都能采样到点或者最终的内点在图像中分布相对均匀。这能提高模型在全图范围内的准确性。5.3 性能优化与高级技巧五点法 vs 八点法在追求极致的实时性且特征点匹配非常精准的场合如高速无人机五点法因其所需点数少在RANSAC框架下可以大幅减少迭代次数从而加快计算。但在普通场景下八点法因其简单稳定配合归一化是更通用和可靠的选择。OpenCV的findEssentialMat函数中methodcv2.RANSAC并指定threshold参数时内部默认使用八点法求解最小样本集模型。误匹配滤除前置在进入RANSAC之前可以进行一些快速的几何过滤。例如使用基础矩阵如果内参未知或本质矩阵如果内参已知的极线约束进行一轮快速的测试虽然此时还没有准确的矩阵但可以设置一个很宽松的阈值快速剔除明显不符合极线几何的离谱误匹配减少RANSAC的负担。并行化RANSACRANSAC的多次迭代是相互独立的非常适合并行计算。在现代CPU或多核设备上可以将迭代任务分配到多个线程或核心中同时进行最后汇总结果这对于高帧率应用是有效的加速手段。不确定性传播在SLAM等严肃应用中我们不仅需要估计值还需要知道估计的不确定性协方差。本质矩阵的估计误差来源于特征点定位误差。可以通过公式推导将图像上的像素误差传播到本质矩阵 (\mathbf{E})进而传播到旋转 (\mathbf{R}) 和平移 (\mathbf{t}) 的估计中。这为后续的非线性优化如Bundle Adjustment提供了初始的信息矩阵权重有助于得到更优的整体解。从对极约束的几何直觉到本质矩阵的数学推导再到八点法、五点法、RANSAC等求解策略最后到运动参数的分解与验证这条链路构成了立体视觉和运动恢复的经典框架。理解每一步背后的“为什么”比记住代码调用更为重要。在实际操作中我强烈建议从零实现一遍这个流程哪怕最初的结果很糟糕。在调试过程中你会深刻体会到数据归一化、阈值选择、退化处理这些细节的重要性这些经验是调用现成库函数无法获得的。当你亲手实现并看到它能正确计算出相机的运动时你对三维视觉的理解会上一个坚实的台阶。