【PCL】—RANSAC点云分割算法详解

参考:https://www.bbsmax.com/A/rV57lnmVdP/

1. 点云分割的概念

  • 点云分割可谓是点云处理的精髓,也是三维图像相对二维图像最大优势的体现。
  • 点云分割的目的是提取点云中的不同物体,从而实现分而治之,突出重点,单独处理的目的。
  • 而现实点云数据处理中,往往需要对场景中的物体有一定先验知识,比如:桌面、墙面多半是大平面,桌上的罐子应该是圆柱体,长方体的盒子可能是牛奶盒…对于复杂场景中的物体,其几何外形可以归结于简单的几何形状。这为分割带来了巨大的便利,因为简单几何形状是可以用方程来描述的,或者说,可以用有限的参数来描述复杂的物体。而方程则代表了物体的拓扑抽象。于是,RANSAC算法可以很好的将此类物体分割出来。

2. RANSAC算法原理

  • RANSAC算法(随机采样一致性)原本是用于数据处理的一种经典算法,其作用是在大量噪声情况下,提取物体中特定的成分。
  • 下图是对 RANSAC 算法效果的说明。图中有一些点显然是满足某条直线的,另外有一团点是纯噪声。目的是在大量噪声的情况下找到直线方程,此时噪声数据量是直线的3倍。
    【PCL】—RANSAC点云分割算法详解_第1张图片
  • 如果用最小二乘法是无法得到这样的效果的,直线大约会在图中直线偏上一点。关于随机采样一致性算法的原理,在wiki百科上讲的很清楚,甚至给出了伪代码和matlab、C代码。见网址:https://en.wikipedia.org/wiki/RANSAC. 我想换一个不那么严肃或者说不那么学术的方式来解释这个算法。
  • 实际上这个算法就是从一堆数据里挑出自己最心仪的数据。所谓心仪当然是有个标准(目标的形式:满足直线方程?满足圆方程?以及能容忍的误差e)。平面中确定一条直线需要2点,确定一个圆则需要3点。随机采样算法,其实就和小女生找男朋友差不多。
  1. 从人群中随便找个男生,看看他条件怎么样,然后和他谈恋爱,(平面中随机找两个点,拟合一条直线,并计算在容忍误差e中有多少点满足这条直线);
  2. 第二天,再重新找个男生,看看他条件怎么样,和男朋友比比,如果更好就换新的(重新随机选两点,拟合直线,看看这条直线是不是能容忍更多的点,如果是则记此直线为结果);
  3. 第三天,重复第二天的行为(循环迭代);
  4. 终于到了某个年龄,和现在的男朋友结婚(迭代结束,记录当前结果)。
  • 显然,如果一个女生按照上面的方法找男朋友,最后一定会嫁一个好的(我们会得到心仪的分割结果)。只要这个模型在直观上存在,该算法就一定有机会把它找到。优点是噪声可以分布的任意广,噪声可以远大于模型信息。
  • 这个算法有两个缺点:第一,必须先指定一个合适的容忍误差e。第二,必须指定迭代次数作为收敛条件。
  • 综合以上特性,本算法非常适合从杂乱点云中检测某些具有特殊外形的物体。

3. PCL中RANSAC方法实现

PCL支持了大量几何模型的RANSAC检测,可以非常方便的对点云进行分割。其调用方法如下:

//创建一个模型参数对象,用于记录结果
  pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);
  //inliers表示误差能容忍的点 记录的是点云的序号
  pcl::PointIndices::Ptr inliers (new pcl::PointIndices);
  // 创建一个分割器
  pcl::SACSegmentation<pcl::PointXYZ> seg;
  // Optional
  seg.setOptimizeCoefficients (true);
  // Mandatory-设置目标几何形状
  seg.setModelType (pcl::SACMODEL_PLANE);
  //分割方法:随机采样法
  seg.setMethodType (pcl::SAC_RANSAC);
  //设置误差容忍范围
  seg.setDistanceThreshold (0.01);
  //输入点云
  seg.setInputCloud (cloud);
  //分割点云
  seg.segment (*inliers, *coefficients);

除了平面以外,PCL几乎支持所有的几何形状。作为点云分割的基础算法,RANSAC很强大,且必收敛,可以作为机器人抓取、识别等后续任务的前处理。

你可能感兴趣的:(人工智能,算法)