对极几何:单目 VO 初始化的模型选择
从对极约束到 E/H 分解,说明平面与纯旋转退化,以及 RANSAC 模型选错为何让初始化「成功但地图 garbage」。

1. 初始化「成功」但地图是 garbage
两帧图像之间的相对位姿——单目 VO 的第一步几乎总是从这里开始。ORB-SLAM 在本质矩阵 与单应 间做模型选择——选错模型,RANSAC 内点够多,分解出的 却对应错误几何,三角化后地图全在错误深度。问题多半不是迭代次数不够,是运动或场景触发了退化。
2. 对极约束与分解
归一化坐标 (去内参后)满足
有 5 dof(scale 不定 + rank-2 约束);SVD 分解得四种 ,用三角化正深度(cheirality check)选物理解。分解后应用 cheirality 在两帧相机系都检查 ,只在一帧正深度会通过 RANSAC 但三角化出负深度点——ORB-SLAM 初始化后地图点数量骤降常是这一步漏检。
单目下 只有方向、尺度不定——尺度来自后续三角化、BA 或外部传感器,这是单目 VO 尺度漂移的根源。
3. 五点法与 RANSAC
至少需 5 对点(Nistér 5-point,最多 10 解)。流程:随机 5 对 → 求 → 分解 + 正深度 → Sampson 距离统计内点 → 全内点 refine。外点率 50% 时需 ~500 次迭代;阈值 应匹配 pixel 噪声(归一化坐标 ~0.001–0.005)。OpenCV findEssentialMat 的 method 影响 RANSAC 行为——换分辨率或焦距, 要同比缩放。
4. 单应 H:平面与纯旋转
场景近似平面或运动近似纯旋转时,3D 点共面 → 的 rank 约束不够, 不可观。改用
有 8 dof,分解得 (平面法向),仍需 cheirality。ORB-SLAM 用内点数加权比较 与 ;桌面、大墙面几乎总是 赢。
5. 宽基线与失败模式
两帧需足够平移 + 旋转, 才稳定。纯旋转或极小平移 → 两种模型都退化 → 应 FAIL 而非硬成功。初始化前看 parallax 中位数: 且 parallax < 1° 应直接拒绝并提示用户平移。宽基线不仅是平移大——适度旋转能避免特征共面,对 和三角化都有利;很多现场初始化失败是操作员只转镜头不平移。
畸变必须在归一化前处理;边缘鱼眼点 undistort 错误 → 系统性偏。动态物体占内点、重复纹理误匹配 → 假 。RANSAC 后用所有内点非线性 refine 再分解。Sampson 距离阈值 约对应 1 pixel(视 )——分辨率变化时 须同比缩放,否则内点统计与真实几何不对齐。
6. 与 SLAM 流水线
初始化: 三角化 → BA。跟踪有地图后用 PnP,不再每帧求 。回环:BoW 召回 → 几何验证( + PnP)。初始化失败多半不是 RANSAC 迭代不够,而是 motion 不对或 E/H 模型选错——先看 parallax 再调 threshold。
Nistér 5-point 最多 10 个 解,实现里要对所有解做 triangulation test,不要只取 SVD 第一个。动态物体占内点多数时, 估计会偏向运动物体——初始化窗口应避开行人密集段,或先用 IMU 旋转筛掉纯旋转段。
7. 验收
- 初始化 E vs H 选择比例(按场景统计)
- RANSAC 内点率;初始化后 triangulated points 平均视差/深度
- 纯旋转 motion bag:应 FAIL,不应 LOST 在 PnP
- Sampson error 分布 vs 阈值
- 初始化成功率 vs 运动类型
对极几何是单目 SLAM 的几何骨架;模型选择与 motion 检查比调 RANSAC 迭代更能决定初始化能不能用。升级 OpenCV 或换相机后应回归初始化通过率——findEssentialMat 的 RANSAC 行为随版本有细微差别,抄 ORB 默认阈值到新设备上不验证,通过率会莫名其妙地掉。平面场景初始化选 后,仍须检查三角化深度分布是否合理,不能只看 RANSAC 内点数。初始化窗口避开动态物体占画面的片段,否则 会拟合运动物体的伪平面。
相关
也可以看看
johan's blog