https://zhuanlan.zhihu.com/p/62175983
在VSLAM中,我们首先构造3D-3D、3D-2D、2D-2D匹配,然后据此去估计相机的运动。完美估计需要完美的匹配,但实际的匹配中往往存在很多错误。如何消除或者降低错误匹配的影响呢?一种方法是选择那些正确的匹配进行估计(RANSAC),另一种是降低那些错误匹配的权重(鲁棒核函数),下面分别介绍。
1. RANSAC随机采样一致算法
这种方法的目的是,从所有数据中选择正确的数据,用于估计。为了方便,先给几个定义。
点:每一个数据,SLAM里指的是匹配的点对
野值/外点:错误的点
内点:正确的点
内点集:内点的集合
外点集:外点的集合
模型:带估计的参数
𝑠 :估计模型所需要的最小点数
𝑆 :所有的点形成的点集
显然,内点集就是我们想要找的正确数据。RANSAC的想法是从点集中随机的选择出 𝑠 个点,估计出一个模型,查看剩余点是否符合这个模型。如果大部分点都符合这个模型,就相当于我们找到了一个合适的模型,自然的符合模型的点就是内点啦。由于是随机选择,一次可能难以找到正确的模型,因此需要多次才可以。下面给出完整的RANSAC算法。
STEP 1. 随机的从 𝑆 中选择 𝑠 个点作为一个样本,估计出模型
STEP 2. 确定在模型距离阈值 𝑡内的数据点集 𝑆𝑖 , 𝑆𝑖 即可为内点集
STEP 3. 如果 𝑆𝑖 的大小大于某个阈值 𝑇 ,用所有内点 𝑆𝑖 重新估计一个更精确的模型
STEP 4. 如果 𝑆𝑖 的大小小于阈值 𝑇 ,则重复1步骤
STEP 5. 经过 𝑁 次试验,选择最大一致集 𝑆𝑖 ,并用 𝑆𝑖 的所有点重新估计模型
RANSAC里面有三个重要的参数需要确定,分别是 𝑡 、 𝑇 、 𝑁 。
一般取 𝛼=95% 。 𝑡2 的取值如下表
https://github.com/ydsf16/MVG_Algorithm/blob/master/src/line_RANSAC.cpp