通俗易懂理解RANSAC算法

RANSAC(Random Sample Consensus),翻译为随机抽样一致算法。

算法思路:从所有观测中随机找到几个尽可能少的点去拟合模型,拟合后依次计算模型和所有观测数据的残差,当残差小于给定的阈值时,就将其判断为内点,大于给定的阈值时,就判断为外点,并统计内点的数量,然后再次随机选取几个点拟合模型迭代。如果本次拟合内点数量大于先前的模型,就将旧模型迭代为新的模型。

做过AMCL算法的同学是不是秒懂了,感觉就是一个低配版的粒子滤波。

直接上代码,以我正在做的项目中的一环进行代码分享(三维平面的拟合)。

#include<Eigen/Dense>#include<cmath>#include<iostream>#include<limits>#include<random>#include<vector>#include"opencv2/highgui.hpp"#include"opencv2/imgproc.hpp"usingnamespacestd;usingnamespacecv;usingnamespaceEigen;structPoint3D{doublex,y,z;};doubledistance(constPoint3D&p1,constPoint3D&p2){returnstd::sqrt(std::pow(p1.x-p2.x,