文章目录
随机采样一致性算法
RANSAC从样本中随机抽选出一个样本子集,使用最小方差估计算法对这个子集计算模型参数,然后计算所有样本与该模型的偏差,再使用一个预先设定好的阈值与偏差比较,当偏差小于阈值时,该样本点属于模型内样本点 ( inliers),或称内部点、局内点或内点,否则为模型外样本点(outliers),或称外部点、局外点或外点,记录下当前的 inliers 的个数,然后重复这一过程。每一次重复都记录当前最佳的模型参数,所谓最佳即是inliers的个数最多 ,此时对应的inliers个数为 best_ninliers 。 每次迭代的末尾都会根据期望的误差率、 best_ninliers、总样本个数、当前迭代次数,计算一 个迭代结束评判因子,据此决定是否迭代结束。迭代结束后,最佳模型参数就是最终的模型参数估计值 。
std::vector<int> PclTool::randomSampleConsensusALG(const pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, const double threshold, const unsigned int type)
{
std::vector<int> inliers;
if (type == 1)
{
// 平面
pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr model_p(new pcl::SampleConsensusModelPlane<pcl::PointXYZ>(cloud));
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_p);
ransac.setDistanceThreshold(threshold);
ransac.computeModel();
ransac.getInliers(inliers);
}
else if (type == 2)
{
// 球体
pcl::SampleConsensusModelSphere<pcl::PointXYZ>::Ptr model_s(new pcl::SampleConsensusModelSphere<pcl::PointXYZ>(cloud));
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_s);
ransac.setDistanceThreshold(threshold);
ransac.computeModel();
ransac.getInliers(inliers);
}
else
{
std::cout << "type error: 1 or 2 " << std::endl;
}
return inliers;
}
-
ransac.setDistanceThreshold(.01);
距离阈值。距离阈值是用来判断数据点是否属于模型内点的关键参数。在拟合几何形状模型时,RANSAC 算法会计算每个数据点到模型的距离,并将距离小于该阈值的点视为模型内点。通常情况下,距离阈值的选择需要根据具体问题和数据集来确定,一般需要通过试验来调整。 -
ransac.computeModel();
用于估计模型参数。在执行该函数之前,必须先设置距离阈值和输入数据。RANSAC 算法会随机选择一组数据点作为初始内点集合,然后根据这些点估计模型参数。接着,它会计算其他数据点到估计模型的距离,并将距离小于阈值的点加入内点集合。这个过程会迭代多次,直到满足停止条件(例如,迭代次数达到预设值或者内点集合的大小达到一定阈值)。 -
ransac.getInliers(inliers);
得到的模型内点的索引。在执行 computeModel 函数之后,可以使用 getInliers 函数获取到被识别为模型内点的数据点的索引,并将这些索引存储在提供的向量 inliers 中。这些索引可以用于后续的进一步处理,例如拟合更精确的模型、剔除噪声点或可视化内点。