基于PCL的点云平面模型分割

  • 1、什么是点云分割
  • 2、如何使用PCL库对将点云中平面模型分割出来

1、什么是点云分割

  顾名思义,点云分割就是将一团点云按照不同需求进行分割处理,一般是用在识别或测量任务的点云预处理步骤。点云分割一般可分为两种。
①是已知数学模型的传统点云分割方法,例如平面模型,球面模型,圆柱面模型等。
②是基于深度学习模型的点云分割,常用于自动驾驶中车体建筑物模型的识别。
  本文只讲解如何使用PCL进行第一种已知点云模型的分割方法。我们将学习如何对一组点进行简单的平面分割,即在点云中找到支持平面模型的所有点。

2、如何使用PCL库对将点云中平面模型分割出来

  废话不多说,直接看官方代码及注释,应用起来非常简单。

#include <iostream>
#include <pcl/ModelCoefficients.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>int
main ()
{//创建点云对象指针pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);// 生成填充符合平面模型的随机点云cloud->width  = 15;cloud->height = 1;cloud->points.resize (cloud->width * cloud->height);for (auto& point: *cloud){point.x = 1024 * rand () / (RAND_MAX + 1.0f);point.y = 1024 * rand () / (RAND_MAX + 1.0f);point.z = 1.0;}// 并添加一些异常值用来测试(*cloud)[0].z = 2.0;(*cloud)[3].z = -2.0;(*cloud)[6].z = 4.0;// 输出生成的点云std::cerr << "Point cloud data: " << cloud->size () << " points" << std::endl;for (const auto& point: *cloud)std::cerr << "    " << point.x << " "<< point.y << " "<< point.z << std::endl;
/*
* 创建SACSegmentation对象并设置模型和方法类型。这也是我们指定距离阈值的地方,它决定了一
* 个点必须离模型多近才能被认为是内层点。在本教程中,将使用RANSAC方法(pcl::SAC_RANSAC)
* 作为选择的鲁棒估计器。我们的决定是由于RANSAC的简单性(其他健壮的估计器使用它作为基础,
* 并添加了额外的、更复杂的概念)。有关RANSAC的更多信息,请查看之前的博文介绍。
*/// 创建模型系数对象指针用于输出分割后的平面模型系数pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);// 创建内层点云索引指针pcl::PointIndices::Ptr inliers (new pcl::PointIndices);// 创建点云分割对象pcl::SACSegmentation<pcl::PointXYZ> seg;// 设置点云分割优化参数:trueseg.setOptimizeCoefficients (true);// 设置模型类型:平面seg.setModelType (pcl::SACMODEL_PLANE);// 设置筛选方法类型:RANSACseg.setMethodType (pcl::SAC_RANSAC);// 设置距离阈值seg.setDistanceThreshold (0.01);// 向分割器中填入点云seg.setInputCloud (cloud);// 开始分割(输出为指向内点的指针,分割出的平面模型系数)seg.segment (*inliers, *coefficients);if (inliers->indices.size () == 0){PCL_ERROR ("Could not estimate a planar model for the given dataset.\n");return (-1);}// 输出平面模型系数std::cerr << "Model coefficients: " << coefficients->values[0] << " " << coefficients->values[1] << " "<< coefficients->values[2] << " " << coefficients->values[3] << std::endl;// 输出分割后的内点std::cerr << "Model inliers: " << inliers->indices.size () << std::endl;for (const auto& idx: inliers->indices)std::cerr << idx << "    " << cloud->points[idx].x << " "<< cloud->points[idx].y << " "<< cloud->points[idx].z << std::endl;return (0);
}

  除了可以分割平面,PCL还支如下模型的分割,具体操作方式大同小异。
PCL支持的分割模型:
SACMODEL_PLANE :平面模型,四个系数是它的海森范式形式:[normal_x normal_y normal_z d]
SACMODEL_LINE : 直线模型,六个系数是直线上一点坐标和法向组成。
SACMODEL_CIRCLE2D :用于确定平面中的2D圆。圆的三个系数由圆心和半径给出。
SACMODEL_CIRCLE3D :用于确定平面中的3D圆。圆的七个系数由圆心、半径和法线给出。
SACMODEL_SPHERE:用于确定球体模型。球体的四个系数由其三维中心和半径给出。
SACMODEL_CYLINDER:用于确定圆柱面模型。圆柱的七个系数由其轴上的一点、轴方向和半径给出。
SACMODEL_CONE:用于确定锥模型。圆锥的七个系数由它的顶点、轴方向和开角给出。
除了以常这些常用的模型以外,还支持平行线,平行面之类的,可以点击这里查看更多。

PCL支持的迭代估计筛选器:
SAC_RANSAC - 随机抽样一致,最简单
SAC_LMEDS - Least Median of Squares
SAC_MSAC - M-Estimator SAmple Consensus
SAC_RRANSAC - Randomized RANSAC
SAC_RMSAC - Randomized MSAC
SAC_MLESAC - Maximum LikeLihood Estimation SAmple Consensus
SAC_PROSAC - PROgressive SAmple Consensus
默认情况下,如果不熟悉上面的大多数估计器以及它们的操作方式,可以使用SAC_RANSAC来测试。
有关RANSAC可以查看维基百科:https://en.wikipedia.org/wiki/RANSAC
或者查看之前的博文:【PCL自学:RANSAC】如何使用PCL随机一致性模型


【博主简介】
  斯坦福的兔子,男,天津大学机械工程工学硕士。毕业至今从事光学三维成像及点云处理相关工作。因工作中使用的三维处理库为公司内部库,不具有普遍适用性,遂自学开源PCL库及其相关数学知识以备使用。谨此将自学过程与君共享。
博主才疏学浅,尚不具有指导能力,如有问题还请各位在评论处留言供大家共同讨论。

【PCL自学:Segmentation1】基于PCL的点云分割:平面模型分割相关推荐

  1. PCL 点云分割与分类 Segmentation RANSAC随机采样一致性 平面模型分割 欧氏距离分割 区域聚类分割算法 最小分割算法 超体聚类 渐进式形态学滤波器

    点云分割 博文末尾支持二维码赞赏哦 _ 点云分割是根据空间,几何和纹理等特征对点云进行划分, 使得同一划分内的点云拥有相似的特征,点云的有效分割往往是许多应用的前提, 例如逆向工作,CAD领域对零件的 ...

  2. 【PCL自学:Segmentation3】基于PCL的点云分割:区域增长分割

    基于PCL的点云区域增长分割 一.什么是区域增长分割 二.区域增长分割原理剖析 三.区域增长分割示例代码 一.什么是区域增长分割   在本文中,我们将学习如何使用pcl:: regiongrow类中实 ...

  3. 【PCL自学:Recognition 1】基于对应分组算法的三维物体识别

    PCL Recognition模块:基于对应分组的三维物体识别 一.初识Recognition点云识别模块 二.基于对应分组算法识别的实例代码及分析 三.三维物体识别的可能对象验证及代码分析 代码效果 ...

  4. 【PCL自学:ocTree】八叉树(octree)的原理及应用案例(点云压缩,搜索,空间变化)

    PCL中八叉树(octree)的原理及应用案例 一.什么是八叉树ocTree? 1.八叉树原理 二.八叉树应用案例 1.点云压缩 2.用八叉树进行空间划分和搜索操作 3.无序点云数据的空间变化检测 一 ...

  5. 29 基于PCL的点云平面分割拟合算法技术路线(针对有噪声的点云数据)

    0 引言 最近项目中用到了基于PCL开发的基于平面的点云和CAD模型的配准算法,点云平面提取采用的算法如下. 1 基于PCL的点云平面分割拟合算法 2 参数及其意义介绍 (1)点云下采样 1. 参数: ...

  6. 基于PCL库的通过ICP匹配多幅点云方法

    基于PCL库的通过ICP匹配多幅点云方法 前言 Code Result 前言 PCL库中有很多配准的方式,主要都是基于ICP ICP算法最初由Besl和Mckey提出,是一种基于轮廓特征的点配准方法. ...

  7. PCL入门系列 —— NormalEstimation、NormalEstimationOMP 基于邻域的点云法线估计

    PCL入门系列 -- NormalEstimation.NormalEstimationOMP 基于邻域的点云法线估计 前言 程序说明 输出结果 代码示例 总结 前言 随着工业自动化.智能化的不断推进 ...

  8. 【PCL自学:Filtering】PCL中的各类滤波器介绍与使用 (持续更新)

    PCL_filter模块中各类滤波器目录 一.直通滤波器(PassThrough):用于阈值滤除 1.直通滤波器介绍 2.示例代码 二.体素滤波器(VoxelGrid filter):用于下采样 1. ...

  9. 【PCL自学:Feature3】PFH点特征直方图的概念和使用 (持续更新)

    一.点特征直方图(PFH)描述子介绍   Point Feature Histograms (PFH) 称为点特征直方图.   随着点特征的研究不断深入,利用点周围的邻近点估计表面法向和曲率的基本操作 ...

最新文章

  1. ATS程序功能和使用方法详解
  2. 数据库维护优化及后期改进约定.实践篇
  3. SilhoNet:一种用于3D对象位姿估计和抓取规划的RGB方法
  4. 空间索引 - GeoHash算法及其实现优化
  5. InfoPath Forms Services的配置
  6. OpenCV iOS-图像处理
  7. 大数据Notebook调研信息汇总(持续更新中)
  8. vision软件_Roboguide软件:高速拾取仿真工作站相机与工具添加与配置
  9. Linux常用命令与基本操作、填空题、简答题
  10. 人生也要一个中心两个基本点(转载)
  11. Linux基础之常见命令用法(一)
  12. English trip M1 - AC9 Nosey people 爱管闲事的人 Teacher:Solo
  13. Buckhorn/跳羚pro12、22、34、k1、k4声卡安装调试教程
  14. android+action +actionform上传文件,ActionForm之文件上传
  15. day03 爬取京东信息,bs4
  16. ddos防火墙的作用和部署
  17. vue前端实现微信支付-微信公众号JSSDK
  18. codeforces 1526B I Hate 1111
  19. [MySQL]-主从同步实战-主从搭建
  20. 搭建 Angular + Cordova + Ionic 集成开发环境

热门文章

  1. 在编辑器插入的视频在网页上直接播放的方法
  2. 精通python如何赚钱_用Python在休闲期月入5000千+!掌握生产工具,就能赚钱
  3. TI OMAP MUX configure
  4. 【2020年领域新星】 刘大一恒 华为
  5. 微信小程序 wxml文件中嵌套循环
  6. 5G+工业互联网 | 三大运营商积极推动工业互联网加快发展
  7. 欧姆龙OMRONPLC之HostLink通讯协议(三)-FINS命令W字/位操作篇
  8. 有没有把语音转为文字的软件?这几个转换软件你值得收藏
  9. sp_replication_agent_checkup
  10. 服务器系统集成商,江苏服务器集成商