博客仅作个人学习记录,如有问题可联系
RANSAC(Random Sample Consensus,随机采样一致)算法是一种随机参数估计算法,通俗说数据是由“内点”和“外点”组成的, “内点”就是组成模型参数的数据,“外点”就是不适合模型的数据,从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法就是RANSAC。“外点”一般指的的数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点,所以RANSAC也是一种“外点”检测算法。
RANSAC实现点云粗配准的主要思路是,首先在对应点集中随机选取3个对应点对,并求解刚体变换矩阵;然后计算对应点中剩余点对,在上一步所求的刚体变换矩阵的作用下点对的距离误差,若其中一点对的距离误差小于设定的阅值误差,则该点为样本内点,否则为样本外点,并统计前者数目;重复以上步骤直至抵达选代次数的上限;最后统计不同刚体变换模型下的样本内点数量,样本内点数量最多的作为最佳数学模型输入,进行计算点云配准操作。即使在无噪声的情况下,RANSAC算法通常也能够产生更好的结果;同时可用于不具有那么多局部特征的数据集,而且 RANSAC不需要两个数据集之间的变换的良好初始估计。
首先是使用的ransac片段全部代码
//--------------------RANSAC点云配准-----------------------------
pcl::SampleConsensusPrerejective<PointT, PointT, pcl::FPFHSignature33> r_sac;
r_sac.setInputSource(cloud_source); // 输入源点云
r_sac.setInputTarget(cloud_target); // 输入目标点云
r_sac.setSourceFeatures(source_fpfh); // 输入源点云FPFH特征
r_sac.setTargetFeatures(target_fpfh); // 输入目标点云FPFH特征
r_sac.setCorrespondenceRandomness(55); // 在选择随机特征对应时,设置要使用的邻居的数量,数值越大,特征匹配的随机性越大。
r_sac.setInlierFraction(0.5f); // 所需的(输入的)inlier分数
r_sac.setNumberOfSamples(10); // 每次迭代中使用的采样点数量
r_sac.setSimilarityThreshold(0.1f); // 将底层多边形对应拒绝器对象的边缘长度之间的相似阈值设置为[0,1],其中1为完全匹配。
r_sac.setMaxCorrespondenceDistance(1.0f);// 内点,阈值 Inlier threshold
r_sac.setMaximumIterations(500); // RANSAC 最大迭代次数
pointcloud::Ptr align(new pointcloud);
r_sac.align(*align);
cout << "\nRANSAC 粗配准has converged, score is " << r_sac.getFitnessScore() << endl;
pcl::transformPointCloud(*cloud_source, *align, r_sac.getFinalTransformation());
cout << "\nRANSAC后变换矩阵:\n" << r_sac.getFinalTransformation() << endl;
Eigen::Matrix4f r_sac_trans = r_sac.getFinalTransformation();