返回专辑
·Johan·4 分钟阅读

五点法:最小解的脾气

findEssentialMat 内部可用 5-point;工程上总包 RANSAC,cheirality 和归一化比算法名字重要。

五点法:最小解的脾气

1. 单次五点解不可信

视觉里程计初始化跑 findEssentialMat,RANSAC 内点率百分之七十八,recoverPose 也返回了旋转和平移——跑十米后尺度漂移、地图弯成香蕉。根因常不是「五点法错了」,是把最小求解器当一键视觉里程计:Nister 五点法给本质矩阵的 minimal solution,最多十个复根;干净匹配时单次解 elegant,脏匹配靠 RANSAC 外壳,多解靠 cheirality 筛选。我很少信任单次五点解——工程上总是 RANSAC 加 recoverPose 加 triangulation verify 三板斧。

2. Essential 与 5-point 约束

本质矩阵 E 有五个自由度;五对归一化点约束五个方程(差一个尺度)。约束为 ,其中 是归一化坐标。OpenCV 封装:

python
E, mask = cv2.findEssentialMat(
    pts1, pts2, K,
    method=cv2.RANSAC,
    prob=0.999,
    threshold=1.0,
    maxIters=1000)
_, R, t, mask_pose = cv2.recoverPose(E, pts1, pts2, K, mask=mask)

threshold归一化平面(像素误差除以焦距),不是像素——七百二十 p 与四 K 不能共用同一像素阈值。点应先 undistort 后配合内参 K。漏 Hartley 归一化自实现 DLT 时条件数爆炸——OpenCV 内部已做。

3. 多解与 cheirality

recoverPose 返回四组旋转平移;五点法本身也可产生多个 E。用 triangulation:最多点在两相机深度为正且重投影误差最小者胜。纯旋转运动时平移近似零,E 仍可估但 平移不可观——应拒绝初始化或等 translation parallax。看本质矩阵分解奇异值,第二第三接近说明退化。平面场景、基线很小时平移方向噪声大,初始化前检查运动是否 sufficient。

4. vs 8-point F 与退化

无内参 K 用八点基础矩阵(findFundamentalMat);有 K 用五点本质矩阵,约束更强,内点阈值语义更清晰。共面匹配基础矩阵更自然;本质矩阵需 sufficient parallax。可选 cv2.USAC_MAGSAC 对 outlier 比例高时更稳。记录返回的 E 秩:秩亏说明退化运动或坏匹配。

5. 匹配质量仍是 bottleneck

五点法是 RANSAC 内循环,不是独立模块。upstream 的 ORB 匹配、ratio test、undistort 质量直接决定 E 估计上限。Hartley 归一化(质心平移加平均距离根号二缩放)在 OpenCV 内部做;若自己实现 minimal solver,这步不能省。我会把 RANSAC 阈值、概率、最大迭代写进配置,并与焦距联动——归一化阈值才有跨分辨率意义。

6. 失败模式

情况表现
纯旋转平移不可观
基线过小平移噪声大
共面匹配E 退化
坏匹配E 秩亏

7. 验收

RANSAC 内点率;recoverPose 内点数;triangulated 正深度比例。同一 match set 对比八点 F 的 downstream 重投影误差。初始化成功后跑几帧 triangulation sanity check——正深度比例低于百分之九十说明 E 不可信,应 reject 而非硬跑。

8. 案例:纯旋转误初始化

某手持扫描纯旋转几帧,findEssentialMat 内点率看似正常,recoverPose 也返回了 t——跑起来地图 scale 乱飘。回看 motion,translation parallax 不足,平移不可观。应检测退化拒绝初始化,等平移运动足够再 init。算法名字 elegant 救不了违反几何假设的数据。

9. 配置与验收清单

RANSAC 阈值在归一化平面,与焦距联动;720p 与 4K 不能共用 pixel 阈值。启动时 log inlier 数、E 秩、recoverPose 正深度比例。验收:inlier ratio;triangulated 正深度比例大于百分之九十;同一 match set 对比八点 F 的 reproj。五点法是内循环,匹配与 undistort 质量是 bottleneck。

10. 与 undistort、K 的契约

pts 必须 undistort 后配合 K;漏 undistort 或 K 与标定不一致,threshold 语义全错。我会把 findEssentialMat 的 method、prob、threshold、maxIters 写进配置,并与 fx 联动打印有效归一化阈值。现场异常先查单位(pixel vs normalized)再查算法。VO 初始化 reject 条件应写清:inlier 率、正深度比例、E 秩——别 inlier 看似够就硬跑。有内参 K 时优先五点 E 路径;无 K 才八点 F。纯旋转、共面、小基线是三类常见退化,应在前端 motion 检测里 reject,而不是交给 recoverPose 事后补救。

← 全部文章

johan's blog