【PCL自学:Segmentation3】基于PCL的点云分割:区域增长分割
基于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的点云分割:区域增长分割相关推荐
- 【PCL自学:Segmentation1】基于PCL的点云分割:平面模型分割
基于PCL的点云平面模型分割 1.什么是点云分割 2.如何使用PCL库对将点云中平面模型分割出来 1.什么是点云分割 顾名思义,点云分割就是将一团点云按照不同需求进行分割处理,一般是用在识别或测量 ...
- 【PCL自学:Recognition 1】基于对应分组算法的三维物体识别
PCL Recognition模块:基于对应分组的三维物体识别 一.初识Recognition点云识别模块 二.基于对应分组算法识别的实例代码及分析 三.三维物体识别的可能对象验证及代码分析 代码效果 ...
- 【PCL自学:ocTree】八叉树(octree)的原理及应用案例(点云压缩,搜索,空间变化)
PCL中八叉树(octree)的原理及应用案例 一.什么是八叉树ocTree? 1.八叉树原理 二.八叉树应用案例 1.点云压缩 2.用八叉树进行空间划分和搜索操作 3.无序点云数据的空间变化检测 一 ...
- 29 基于PCL的点云平面分割拟合算法技术路线(针对有噪声的点云数据)
0 引言 最近项目中用到了基于PCL开发的基于平面的点云和CAD模型的配准算法,点云平面提取采用的算法如下. 1 基于PCL的点云平面分割拟合算法 2 参数及其意义介绍 (1)点云下采样 1. 参数: ...
- 基于PCL库的通过ICP匹配多幅点云方法
基于PCL库的通过ICP匹配多幅点云方法 前言 Code Result 前言 PCL库中有很多配准的方式,主要都是基于ICP ICP算法最初由Besl和Mckey提出,是一种基于轮廓特征的点配准方法. ...
- PCL入门系列 —— NormalEstimation、NormalEstimationOMP 基于邻域的点云法线估计
PCL入门系列 -- NormalEstimation.NormalEstimationOMP 基于邻域的点云法线估计 前言 程序说明 输出结果 代码示例 总结 前言 随着工业自动化.智能化的不断推进 ...
- 【PCL自学:Filtering】PCL中的各类滤波器介绍与使用 (持续更新)
PCL_filter模块中各类滤波器目录 一.直通滤波器(PassThrough):用于阈值滤除 1.直通滤波器介绍 2.示例代码 二.体素滤波器(VoxelGrid filter):用于下采样 1. ...
- 【PCL自学:Feature3】PFH点特征直方图的概念和使用 (持续更新)
一.点特征直方图(PFH)描述子介绍 Point Feature Histograms (PFH) 称为点特征直方图. 随着点特征的研究不断深入,利用点周围的邻近点估计表面法向和曲率的基本操作 ...
- PCL:基于PCL绘制包围盒代码实现(2)
本博客基于pcl::MomentOflnertiaEstimation类获取基于惯性矩(moment of inertia)与偏心率(eccentricity)的描述子,而该类的另一个功能就是提取有向 ...
最新文章
- js通过正则表达式解析xml 获取指定的内容
- Angular 中后台前端解决方案 - Ng Alain 介绍
- IRP_MJ_CREATE
- python elementtree 父节点_python-访问ElementTree节点父节点
- 笔记:设计模式(3)-Abstract Factory抽象工厂模式
- 1. 观察者模式总结(C++)
- oracle 谭岚_Hibernate实现Oracle BLOB的数据读写(2)
- 中科大陈秀雄团队成功证明凯勒几何两大核心猜想,研究登上《美国数学会杂志》...
- 前后端敏感数据加密方案及实现_01
- 几张一模一样的照片_两张一模一样的照片看起来却不一样!什么鬼?
- 微课|中学生可以这样学Python(例6.3):猜数游戏
- Linux yum更新源url
- 各种语音编码方法,所需要的带宽
- 读王元之《数学大辞典》
- 暑期聊天室的挣扎:Linux C编程学习笔记(一)
- 433MHz LoRa/FSK 无线频谱波形分析(频谱分析仪测试LoRa/FSK带宽、功率、频率误差等)
- c语言中引用sqrt需要cmath嘛,c语言根号(c语言中根号怎么输入)
- Awvs详细使用教程
- 利用python进行数据分析~基金分析
- html音频禁止自动播放,HTML iframe允许音频文件的自动播放无法正常使用