基于PCL的点云区域增长分割

  • 一、什么是区域增长分割
  • 二、区域增长分割原理剖析
  • 三、区域增长分割示例代码

一、什么是区域增长分割

  在本文中,我们将学习如何使用pcl:: regiongrow类中实现的区域增长算法。所述算法的目的是将在平滑性约束方面足够接近的点分类。因此,该算法的输出是聚类的集合,其中每个聚类都是一组点,被认为是同一光滑曲面的一部分。该算法的工作是基于点法线之间角度的比较。

二、区域增长分割原理剖析

  让我们来看看该算法是如何工作的。
  1.首先,它根据它们的曲率值对点进行分类。之所以要这样做是因为这个区域从曲率最小的点开始增长。这是因为曲率最小的点位于平坦的区域(从最平坦的区域增长可以减少分割总数)。
  2.选中的点被添加到名为seeds(增长种子集合)的集合中。
  3.对于每个种子点,算法找到它的邻近点。
    a.每个邻居都被计算它的法线和当前种子点的法线之间的角度。如果角度小于阈值,则将当前点添加到当前种子所在区域。
    b.然后对每个邻域进行曲率值测试。如果曲率小于阈值,则将此点添加到种子集合中作为新种子。
    c.从种子集合中删除当前的种子。
  4.如果种子集变成空的,这意味着算法扩大了区域,这个过程从头开始重复迭代,直到种子集合为空。

三、区域增长分割示例代码

#include <iostream>
#include <vector>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/search/search.h>
#include <pcl/search/kdtree.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/filters/filter_indices.h> // for pcl::removeNaNFromPointCloud
#include <pcl/segmentation/region_growing.h>int
main ()
{// 读取点云pcd文件pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);if ( pcl::io::loadPCDFile <pcl::PointXYZ> ("region_growing_tutorial.pcd", *cloud) == -1){std::cout << "Cloud reading failed." << std::endl;return (-1);}// 建立搜索KD树pcl::search::Search<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);
// 计算点云法向pcl::PointCloud <pcl::Normal>::Ptr normals (new pcl::PointCloud <pcl::Normal>);pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> normal_estimator;normal_estimator.setSearchMethod (tree); // 搜索方法为kd树走索normal_estimator.setInputCloud (cloud);  // 填入点云normal_estimator.setKSearch (50);           // 设置搜索范围normal_estimator.compute (*normals);       // 将法相保存在normalspcl::IndicesPtr indices (new std::vector <int>);pcl::removeNaNFromPointCloud(*cloud, *indices); // 对点云建立索引pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg; // 区域增长类reg.setMinClusterSize (50);        // 设置最小的集合点数reg.setMaxClusterSize (1000000);    // 设置最大集合点数reg.setSearchMethod (tree);      // 设置kd树搜索方法reg.setNumberOfNeighbours (30); // 设置每次邻域搜索数(影响计算速度)reg.setInputCloud (cloud);      // 设置输入点云reg.setIndices (indices);          // 设置输入的索引reg.setInputNormals (normals);    // 设置输入法向reg.setSmoothnessThreshold (3.0 / 180.0 * M_PI); // 设置平滑度阈值(弧度)reg.setCurvatureThreshold (1.0);  // 设置曲率阈值// 分类集合 并开始计算std::vector <pcl::PointIndices> clusters;reg.extract (clusters);// 一系列输出std::cout << "Number of clusters is equal to " << clusters.size () << std::endl;std::cout << "First cluster has " << clusters[0].indices.size () << " points." << std::endl;std::cout << "These are the indices of the points of the initial" <<std::endl << "cloud that belong to the first cluster:" << std::endl;std::size_t counter = 0;while (counter < clusters[0].indices.size ()){std::cout << clusters[0].indices[counter] << ", ";counter++;if (counter % 10 == 0)std::cout << std::endl;}std::cout << std::endl;
// 显示出分割后的点云,并赋予不同颜色pcl::PointCloud <pcl::PointXYZRGB>::Ptr colored_cloud = reg.getColoredCloud ();pcl::visualization::CloudViewer viewer ("Cluster viewer");viewer.showCloud(colored_cloud);while (!viewer.wasStopped ()){}return (0);
}

运行效果如下:


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

【PCL自学:Segmentation3】基于PCL的点云分割:区域增长分割相关推荐

  1. 【PCL自学:Segmentation1】基于PCL的点云分割:平面模型分割

    基于PCL的点云平面模型分割 1.什么是点云分割 2.如何使用PCL库对将点云中平面模型分割出来 1.什么是点云分割   顾名思义,点云分割就是将一团点云按照不同需求进行分割处理,一般是用在识别或测量 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. PCL:基于PCL绘制包围盒代码实现(2)

    本博客基于pcl::MomentOflnertiaEstimation类获取基于惯性矩(moment of inertia)与偏心率(eccentricity)的描述子,而该类的另一个功能就是提取有向 ...

最新文章

  1. js通过正则表达式解析xml 获取指定的内容
  2. Angular 中后台前端解决方案 - Ng Alain 介绍
  3. IRP_MJ_CREATE
  4. python elementtree 父节点_python-访问ElementTree节点父节点
  5. 笔记:设计模式(3)-Abstract Factory抽象工厂模式
  6. 1. 观察者模式总结(C++)
  7. oracle 谭岚_Hibernate实现Oracle BLOB的数据读写(2)
  8. 中科大陈秀雄团队成功证明凯勒几何两大核心猜想,研究登上《美国数学会杂志》...
  9. 前后端敏感数据加密方案及实现_01
  10. 几张一模一样的照片_两张一模一样的照片看起来却不一样!什么鬼?
  11. 微课|中学生可以这样学Python(例6.3):猜数游戏
  12. Linux yum更新源url
  13. 各种语音编码方法,所需要的带宽
  14. 读王元之《数学大辞典》
  15. 暑期聊天室的挣扎:Linux C编程学习笔记(一)
  16. 433MHz LoRa/FSK 无线频谱波形分析(频谱分析仪测试LoRa/FSK带宽、功率、频率误差等)
  17. c语言中引用sqrt需要cmath嘛,c语言根号(c语言中根号怎么输入)
  18. Awvs详细使用教程
  19. 利用python进行数据分析~基金分析
  20. html音频禁止自动播放,HTML iframe允许音频文件的自动播放无法正常使用

热门文章

  1. FlexRay AUTOSAR网络管理(AUTOSARFRNM)简介
  2. Google Analytics账户如何删除域名网址?
  3. Python 数据库连接方法和数据库连接池
  4. RadioButton 和 RadioButtonList 比较
  5. 相位相关影像匹配算法
  6. c语言指针 —— 面试题
  7. Vue项目启动内存溢出 js stack overflow
  8. 51单片机驱动ESP8266
  9. ADC类型和技术指标
  10. 使用pytorch获取bert词向量