博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PCL—低层次视觉—点云分割(RanSaC)
阅读量:7114 次
发布时间:2019-06-28

本文共 1832 字,大约阅读时间需要 6 分钟。

点云分割

  点云分割可谓点云处理的精髓,也是三维图像相对二维图像最大优势的体现。不过多插一句,自Niloy J Mitra教授的出现,最优分割到底鹿死谁手还不好说。暂且不论他开挂的图像处理算法,先安心做一个PCL吹~

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

RanSaC算法

  RanSaC算法(随机采样一致)原本是用于数据处理的一种经典算法,其作用是在大量噪声情况下,提取物体中特定的成分。下图是对RanSaC算法效果的说明。图中有一些点显然是满足某条直线的,另外有一团点是纯噪声。目的是在大量噪声的情况下找到直线方程,此时噪声数据量是直线的3倍。

  如果用最小二乘法是无法得到这样的效果的,直线大约会在图中直线偏上一点。关于随机采样一致性算法的原理,在wiki百科上讲的很清楚,甚至给出了伪代码和matlab,C代码。见网址https://en.wikipedia.org/wiki/RANSAC. 我想换一个不那么严肃或者说不那么学术的方式来解释这个算法。

  实际上这个算法就是从一堆数据里挑出自己最心仪的数据。所谓心仪当然是有个标准(目标的形式:满足直线方程?满足圆方程?以及能容忍的误差e)。平面中确定一条直线需要2点,确定一个圆则需要3点。随机采样算法,其实就和小女生找男朋友差不多。

  1. 从人群中随便找个男生,看看他条件怎么样,然后和他谈恋爱,(平面中随机找两个点,拟合一条直线,并计算在容忍误差e中有多少点满足这条直线)
  2. 第二天,再重新找个男生,看看他条件怎么样,和男朋友比比,如果更好就换新的(重新随机选两点,拟合直线,看看这条直线是不是能容忍更多的点,如果是则记此直线为结果)
  3. 第三天,重复第二天的行为(循环迭代)
  4. 终于到了某个年龄,和现在的男朋友结婚(迭代结束,记录当前结果)

  显然,如果一个女生按照上面的方法找男朋友,最后一定会嫁一个好的(我们会得到心仪的分割结果)。只要这个模型在直观上存在,该算法就一定有机会把它找到。优点是噪声可以分布的任意广,噪声可以远大于模型信息。

  这个算法有两个缺点,第一,必须先指定一个合适的容忍误差e。第二,必须指定迭代次数作为收敛条件。

  综合以上特性,本算法非常适合从杂乱点云中检测某些具有特殊外形的物体。

PCL中基于RanSaC的点云分割方法

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

  

//创建一个模型参数对象,用于记录结果  pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);  //inliers表示误差能容忍的点 记录的是点云的序号  pcl::PointIndices::Ptr inliers (new pcl::PointIndices);  // 创建一个分割器  pcl::SACSegmentation
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很强大且必收敛,可以作为机器人抓取,识别等后续任务的前处理。

转载地址:http://xnghl.baihongyu.com/

你可能感兴趣的文章
[AngularJS] Using an AngularJS directive to hide the keyboard on submit
查看>>
Git查看、删除、重命名远程分支和tag(转)
查看>>
如何在Node.js中合并两个复杂对象
查看>>
【AtCoder010】B - Boxes(差分)
查看>>
12C -- ORA-01017
查看>>
Compile、Make和Build的区别(as make, build, clean, run)
查看>>
介绍三款串口监控工具:Device Monitoring Studio,portmon,Comspy
查看>>
maven常用命令介绍
查看>>
J2EE之Servlet初见
查看>>
Controller 接口控制器详解
查看>>
linux下apache的使用
查看>>
使用 systemd timer 备份数据库
查看>>
Struts2工作原理及流程
查看>>
oracle数据库获取指定表的列的相关信息
查看>>
维克里拍卖 Vickrey auction
查看>>
Docker镜像的获取与删除
查看>>
Codeforces Round #370 (Div. 2) C. Memory and De-Evolution 水题
查看>>
别说无所谓
查看>>
Puppetmaster高可用和可扩展的方案设计
查看>>
[转载]ASP.NET伪静态页面的实现和伪静态在IIS7.0中的配置
查看>>