第241篇 视觉SLAM前端之对极几何——本质矩阵和基础矩阵

📅 发布时间:2026/9/2 15:27:52
第241篇 视觉SLAM前端之对极几何——本质矩阵和基础矩阵
上一篇讲了特征匹配得到了两幅图像之间的对应点对。这篇要解决一个关键问题怎么从这些二维的匹配点中恢复出相机的三维运动这个问题听起来很难但对极几何提供了一套优雅的数学工具来解决它。这就是对极几何要解决的事情。对极几何描述的是两个相机视角之间的几何关系核心工具是本质矩阵Essential Matrix和基础矩阵Fundamental Matrix。这两个矩阵看起来名字差不多但含义有区别。面试的时候它们的区别和联系是高频考点你得能讲清楚。对极几何的基本概念两个相机从不同位置拍摄同一个场景。对于空间中的任意一个3D点P它在两个相机图像上的投影分别是p₁和p₂。p₁和p₂之间存在一个约束关系这个关系就是由对极几何描述的。几个关键概念光心O₁和O₂两个相机的位置。 基线两个光心的连线。基线越长深度估计越准。这就是双目相机两个镜头要隔一段距离的原因。 极线O₁和P确定的平面与第二个图像平面的交线。p₂一定在这条线上。极线的方向取决于相机的运动方向和场景结构。 极点基线与图像平面的交点。所有极线都经过极点。当相机纯平移时极点就是平移方向在图像上的消失点。对极约束的意思是如果你知道了p₁的位置p₂不是可以在图像上任意出现的它被限制在一条直线上极线。这个约束把搜索空间从二维降到了一维。打个比方你用左眼看一个物体然后用手指指向它。右眼顺着手指的方向看过去一定能找到那个物体。右眼不需要在整个视野里搜索只需要沿着手指方向极线找就行了。几个关键概念的直觉理解基线越长深度估计越准这就是双目相机两个镜头要隔一段距离的原因。极线描述了搜索的约束方向。极点是所有极线交汇的地方当相机纯旋转时极点就是旋转中心在图像上的投影。本质矩阵E本质矩阵描述的是两个相机坐标系之间的对极约束用的是归一化相机坐标去掉了内参的影响。对于一对匹配点p₁和p₂归一化坐标对极约束可以写成p₂ᵀ E p₁ 0E是一个3×3的矩阵秩为2有两个相等的非零奇异值。E由相机的旋转R和平移t决定E [t]× R其中[t]×是平移向量的反对称矩阵。本质矩阵有5个自由度旋转3个平移方向2个平移的尺度被归一化了。所以至少需要5对匹配点才能求解这就是著名的五点法。Nister在2004年给出了五点法的高效解法现在OpenCV里用的就是这个。# 用OpenCV求解本质矩阵五点法 E, mask cv2.findEssentialMat(pts1, pts2, focal, pp, cv2.RANSAC) # 从本质矩阵恢复R和t _, R, t, mask cv2.recoverPose(E, pts1, pts2, focal, pp)基础矩阵F基础矩阵和本质矩阵类似但它描述的是像素坐标之间的约束没有去掉相机内参。p₂ᵀ F p₁ 0这里的p₁和p₂是像素坐标不是归一化坐标。F和E的关系是F K⁻ᵀ E K⁻¹K是相机内参矩阵。基础矩阵有7个自由度至少需要7对匹配点求解。但实际中通常用8对点八点法因为计算更简单稳定。# 用OpenCV求解基础矩阵八点法 F, mask cv2.findFundamentalMat(pts1, pts2, cv2_FM_RANSAC)E和F的区别面试官问E和F有什么区别核心回答三点坐标不同E用的是归一化相机坐标F用的是像素坐标。E假设你已经知道相机内参并去掉了它的影响F不需要。自由度不同E有5个自由度F有7个。因为E的平移尺度不确定少一个自由度而且两个非零奇异值相等又少一个。关系F K⁻ᵀ E K⁻¹。如果你知道相机内参K可以从F算出E进而恢复R和t。如果不知道内参只能用F做对极约束没法恢复运动。实际中如果你标定过相机知道内参优先用E。如果没标定只能用F。退化场景对极几何在某些特殊场景下会失效。纯旋转的情况如果相机只旋转不平移基线长度为零本质矩阵退化为零矩阵。这时候对极约束不存在无法恢复运动。解决方法是加入平移运动或者用其他方法比如IMU来估计旋转。平面场景的情况如果所有特征点都在同一个平面上比如看一面墙对极约束退化为单应性约束。这时候本质矩阵的求解不稳定应该改用单应矩阵Homography来估计运动。实际SLAM系统会同时计算E和H单应矩阵然后根据内点数量来选择更可靠的那个。这就是ORB-SLAM初始化时做的事情。# 同时计算E和H选择内点多的 E, mask_E cv2.findEssentialMat(pts1, pts2, focal, pp) H, mask_H cv2.findHomography(pts1, pts2, cv2.RANSAC) if np.sum(mask_H) np.sum(mask_E): use_homography() # 平面场景用H更稳定 else: use_essential() # 一般场景用E从匹配点到相机运动完整的流程是这样的第一步提取特征并匹配得到若干对匹配点。 第二步用RANSACE/F求解剔除误匹配得到本质矩阵或基础矩阵。 第三步从E分解出R和t或者从F内参算出E再分解。 第四步用R和t做三角化恢复3D点的位置。三角化就是用两个相机的位姿和匹配点通过射线交汇来估计3D点的位置。两条射线理论上应该交于一点但因为噪声的存在实际上不会精确交汇需要用最小二乘法求最优解。OpenCV提供了现成的三角化函数内部用的就是SVD分解来求解最小二乘问题。# 三角化 pts_4d cv2.triangulatePoints(P1, P2, pts1_norm, pts2_norm) pts_3d pts_4d[:3] / pts_4d[3] # 齐次坐标转三维坐标面试中的追问为什么本质矩阵的秩是2 因为E [t]× R反对称矩阵[t]×的秩是2乘以可逆矩阵R不改变秩。秩为2意味着E的行列式为零这个约束在求解的时候要用到。单目SLAM为什么有尺度不确定性 因为从E分解出来的t只有方向没有大小。你没法从图像中判断物体实际有多远只能恢复相对运动。这就是为什么单目SLAM的地图尺度是任意的需要额外的信息比如已知尺寸的物体、IMU数据来确定真实尺度。八点法比五点法差吗 不是。五点法是最小解计算复杂但需要的点少。八点法是线性解法计算简单但需要更多点。实际中用RANSAC的时候五点法作为内层求解器更高效因为每次迭代只需要5个点。RANSAC迭代次数怎么算 公式是 k log(1-p) / log(1-(1-e)^s)p是置信度通常0.99e是外点比例s是最小样本数。假设外点比例30%用五点法需要迭代约597次。如果外点比例50%需要1177次。外点越多迭代次数越多。工程实践中的注意事项实际做SLAM的时候对极几何有几个坑要注意。第一特征点要尽量分散在图像各处。如果所有匹配点都集中在图像的一个小区域求解出来的E/F矩阵不稳定位姿估计误差会很大。这就是为什么ORB-SLAM用网格化来保证特征点均匀分布。第二视差要够大但不能太大。视差太小相机几乎没动三角化的深度估计误差会很大。视差太大相机转了很大角度特征匹配会变得困难。一般建议相邻帧的视差在图像宽度的10%-20%之间。第三RANSAC的参数要调好。内点判定阈值reprojection error的阈值设得太小会丢掉很多正确的匹配设得太大又会保留误匹配。通常设为1-3个像素具体要根据图像分辨率和特征提取的精度来调。对极几何是视觉SLAM前端的核心数学工具。理解了本质矩阵和基础矩阵你就能明白SLAM是怎么从二维图像中推算出三维运动的。这个知识点面试考得很多概念要清晰公式不用死记但物理意义一定要理解。上一篇第240篇 视觉SLAM前端之特征匹配——BF/FLANN和误匹配剔除下一篇我们聊PnP问题——已知3D-2D对应关系怎么估计相机的位姿。PnP是视觉SLAM跟踪阶段最常用的位姿估计方法重要性不亚于对极几何。如果这篇文章对你有帮助欢迎点赞支持一下你的鼓励是我持续更新的最大动力