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

RANSAC:内点率太低别硬刚

RANSAC 迭代次数随 outlier 比例指数增长;内点率 <30% 时应先改善匹配和归一化,而非把 confidence 调到 0.99999。

RANSAC:内点率太低别硬刚

1. 迭代开到十万,不如把匹配洗干净

单应、本质、位姿估计的随机采样一致性外壳相同,但最小样本大小和阈值单位不同——混用是静默失效。内点率低于三成时随机采样一致性 理论上就不可靠,加最大迭代救不了脏匹配。工程师把置信度调到零点九九九九九、迭代开到十万,内点率仍一成五——问题在匹配器,不在随机采样一致性参数。

随机采样一致性是鲁棒外壳,不是魔法。垃圾进则自信的错误出。

2. 迭代次数公式

期望置信度, 外点比例, 最小样本大小。外点比例零点五、最小样本八(单应)时迭代已经很大——外点过半,随机采样一致性指数爆炸。

OpenCV 参数可设,但救不了脏匹配:

python
H, mask = cv2.findHomography(src, dst, cv2.RANSAC,
                             ransacReprojThreshold=3.0,
                             maxIters=2000, confidence=0.995)

3. 模型与阈值单位

模型OpenCV最小样本阈值单位
单应findHomography4像素(去畸变后)
基础findFundamentalMat7/8像素
本质findEssentialMat5归一化坐标
位姿solvePnPRansac4重投影像素

去畸变点再估本质矩阵;比率测试、互检前置筛外点。哈特利归一化中心化加缩放,直接线性变换条件数更好。七百二十p 与四K 不能共用同一像素阈值——阈值与焦距像素成比例。

4. 退化与通用采样一致性

平面运动场景估基础矩阵、纯旋转场景估平移——RANSAC 会自信返回数学上 inlier 多但物理错的模型。加 F/H 竞争或 scene prior 是退化场景的常规做法,不是过度工程。

OpenCV 四点五以上支持通用采样一致性最大后验,对未知噪声尺度更鲁棒:

python
E, mask = cv2.findEssentialMat(pts1, pts2, K, method=cv2.USAC_MAGSAC, threshold=1.0)

内点上二次优化:迭代求解位姿,使用外参初值。匹配按分数排序时优先采样一致性早停——OpenCV 不内置,但原理是优先抽高质量匹配。记录每次 RANSAC 的内点率与平均残差,便于对比不同分辨率与场景下的基线。

5. 记录内点率是早期预警

每次随机采样一致性内点率应进日志;突降是匹配质量或场景变化的早期预警,比等下游定位发散再查省时间。若 inlier 率 fifty percent 仍 fail,问题几乎总在 matching 或 normalize,不在 maxIters。局部优化在 inlier 上二次求解位姿,使用外参初值——OpenCV 部分实现默认开启 refine。

6. 案例:四K 沿用七百二十p 阈值

视觉里程计在四K 图像上用三点像素随机采样一致性阈值,内点率看起来正常但位姿漂移。根因是阈值未按焦距缩放——改为一像素(归一化坐标)并先去畸变点后,内点率从三成升到六成,下游才稳定。单位混用是静默失效。

7. 验收

  • 报告内点率、平均残差、是否触顶最大迭代
  • 内点率低于三成先查匹配;高于六成仍下游失败查阈值单位和退化
  • 每次随机采样一致性内点率进日志;突降是匹配或场景变化的早期预警

随机采样一致性阈值必须跟 误差单位 一致——720p 与 4K 不能共用同一像素阈值。匹配前置的比率测试、互检比事后加迭代更有效;内点率长期低于三成说明上游该换描述子或加几何约束,不是调 confidence。

← 全部文章

johan's blog