随机一致性采样RANSAC是一种鲁棒的模型拟合算法,能够从有外点的数据中拟合准确的模型。
RANSAC过程中用到的参数
N-- 拟合模型所需要的最少的样本个数
K--算法的迭代次数
t--用于判断数据是否是内点
d--判定模型是否符合使用于数据集,也就是判断是否是好的模型
RANSAC算法过程
1 for K 次迭代
2 从数据中均匀随机采样N个点
3 利用采样的N个点拟合你个模型
4 for 对于除采样点外的每一个样本点
5 利用t检测样本点到模型的距离,如果小于t则认为是一致,否则认为是外点
6 end
7 如果有d或者更多的一致点,则认为拟合的模型是好的
8 end
9 使用拟合误差作为标准,选择最好的拟合模型
迭代次数的计算
假设 r = 内点个数/所有点的个数
则:
p0 = pow(r, N) 表示采样的N个点全为内点,也就是是一次有效采样的概率
p1 = 1 - pow(r, N) 表示采样的N个点中至少有一个外点,即一次无效采样的概率
p2 = pow(p1, K) 表示K次无效采样的概率
假设p表示K次采样中至少一次采样是有效采样,则有1-p = pow(p1, K), 两边取对数
则有 K = log(1- p )/log(1-p1).
附一份来自google 的RANSAC的代码框架
#ifndef FVISION_RANSAC_H_
#define FVISION_RANSAC_H_
#include <fvision/utils/random_utils.h>
#include <fvision/utils/misc.h>
#include <vector>
#include <iostream>
#include <cassert>
namespace fvision {
class RANSAC_SamplesNumber {
public:
RANSAC_SamplesNumber(int modelSampleSize) {
this->s = modelSampleSize;
this->p = 0.99;
}
~RANSAC_SamplesNumber(void) {}
public:
long calcN(int inliersNumber, int samplesNumber) {
double e = 1 - (double)inliersNumber / samplesNumber;
//cout<<"e: "<<e<<endl;
if (e > 0.9) e = 0.9;
//cout<<"pow: "<<pow((1 - e), s)<<endl;
//cout<<log(1 - pow((1 - e), s))<<endl;
long N = (long)(log(1 - p) / log(1 - pow((1 - e), s)));
if (N < 0) return (long)1000000000;
else return N;
}
private:
int s; //samples size for fitting a model
double p; //probability that at least one of the random samples if free from outliers
//usually 0.99
};
//fit a model to a set of samples
template