在本教程中,我们将学习如何在平面模型中使用RandomSampleConsensus
来获得适合该模型的云。
#理论入门
RANdom SAmple Consensus
的缩写是RANSAC
,它是一种迭代方法,用于从包含异常值的一组数据中估计数学模型的参数。该算法由Fischler和Bolles于1981年发表.RANSAC
算法假设我们所看到的所有数据都是由内点(inliers)
和外点(outliers)
构成的。Inlier
可以用具有一组特定参数值的模型来解释,而异常值在任何情况下都不适合该模型。另一个必要的假设是可以从数据中最优地估计所选模型的参数的过程。
???????以下来自Wikipedia???????
RANSAC算法的输入是一组观测数据值,一个可以解释或适合观测值的参数化模型,以及一些置信度参数。
RANSAC通过迭代选择原始数据的随机子集来实现其目标。这些数据是假设的内点,然后这个假设测试如下:
一个模型拟合到假设的内部,即模型的所有自由参数从内部重建。
所有其他数据然后对拟合模型进行测试,如果一个点适合估计模型,也被认为是一个假设inlier。
如果足够多的点被归类为假想内点,则估计的模型是相当好的。
这个模型是从所有假想的内点估算的,因为它只是从最初的一组假设的内点估计出来的。
最后,通过估计内部相对于模型的误差来评估模型。
这个过程被重复固定的次数,每次产生一个被拒绝的模型,因为太少的点被归类为inlier
或者一个改进的模型以及一个相应的误差测量。在后一种情况下,如果它的误差低于上次保存的模型,我们保留精化模型(refined model)。
RANSAC的一个优点是它能够对模型参数进行鲁棒估计,即,即使在数据集中存在大量的异常值时,它也可以高准确度地估计参数。 RANSAC的缺点是计算这些参数所花的时间没有上限。 当计算出的迭代次数有限时,得到的解决方案可能不是最优的,甚至可能不是一个很好的适合数据的解决方案。 通过这种方式,RANSAC提供了一个权衡。 通过计算更多的迭代次数,增加了产生合理模型的概率。 RANSAC的另一个缺点是需要设置特定于问题的阈值。
RANSAC只能估计一个特定数据集的一个模型。至于任何一个模型的方法,当两个(或更多)模型存在时,RANSAC可能找不到任一个。
_images / random_sample_example1.png _images / random_sample_example2.png
左侧和右侧的图片显示了RANSAC算法在二维数据集上的简单应用。我们左边的图像是包含内点和外点的数据集的直观表示。我们右侧的图像以红色显示所有异常值,并以蓝色显示异常值。蓝线是RANSAC完成的工作的结果。在这种情况下,我们试图拟合数据的模型是一条线,它看起来非常适合我们的数据。
???????以上来自Wikipedia???????
#代码
用你最喜欢的编辑器创建一个random_sample_consensus.cpp
文件,并在里面放置以下内容:
#include <iostream>
#include <pcl/console/parse.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_plane.h>
#include <pcl/sample_consensus/sac_model_sphere.h>
#include <pcl/visualization/pcl_visualizer.h>
#inc