学习PCL库:PCL库中实现了哪些分割算法?

公众号致力于点云处理,SLAM,三维视觉,高精地图等领域相关内容的干货分享,欢迎各位加入,有兴趣的可联系dianyunpcl@163.com。未经作者允许请勿转载,欢迎各位同学积极分享和交流。

segmentation模块

PCL(Point Cloud Library)中的分割模块提供了一系列用于对点云数据进行分割算法。

a41291d3421237f4095df665a535e10e.jpeg

主要内容

pcl::ConditionalEuclideanClustering是基于欧几里得距离对点云进行聚类分割,可以实现不同大小、形状和密度的物体分离,ConditionalEuclideanClustering算法可以设置条件参数,可以实现更加精细的点云分割。例如在欧几里得距离上设置条件限制,从而只聚类距离相近的点云,达到更好的分割效果。

pcl::CPCSegmentation是一个用于平面分割的模块,它是基于凸包的几何方法实现的,可以在复杂场景中快速高效地进行平面分割,原理是基于点云的局部凸包构建的,它首先将点云划分为多个局部区域,然后对每个区域构建凸包,最后将凸包进行分割,得到平面的集合。

pcl::EuclideanClusterExtraction 是用于对欧几里得聚类(Euclidean Clustering)的实现,它将输入点云中的点分割为不同的聚类,每个聚类由一组近邻的点组成。

pcl::LabeledEuclideanClusterExtraction可以用于从点云数据中提取聚类,并为每个聚类分配唯一的标签,它是pcl::EuclideanClusterExtraction的扩展,增加了对点云中噪声点和离群点的处理,并且可以为每个聚类分配唯一的标签,该模块基于欧几里得距离聚类,通过设置距离阈值和最小聚类大小来控制聚类的粒度,聚类的过程中,还可以设置聚类的范围,比如只聚类点云数据中的一个区域,这样可以避免处理无关的点云数据。

pcl::ExtractPolygonalPrismData 是 PCL 库中的一个滤波器,用于提取多边形的柱状体(Polygonal Prism)内的点云数据。其主要原理是在 3D 空间中定义一个多边形,并且指定其高度,然后提取多边形的柱状体内的所有点。

pcl::GrabCut是一个基于图像分割的算法,用于对点云进行分割。该算法基于机器学习方法,结合了颜色和空间信息,能够对点云中的目标进行精确分割。算法步骤:

  • 1. 初始化:首先,对点云中的每个点进行标记,将其标记为前景或背景。这一步可以通过手动标记或者基于物体边界框进行自动标记来完成。

  • 2. 能量函数:能量函数包括数据项和平滑项。数据项表示每个点在当前标记下属于前景或背景的概率,由高斯模型计算得出。平滑项表示相邻点之间标记不同的代价。

  • 3. 图割算法:使用图割算法求解能量函数的最小割,即找到一个最优的标记方式,使得数据项和平滑项的代价最小。

  • 4. 迭代优化:根据当前标记结果,重新计算高斯模型,并重新求解能量函数的最小割。迭代进行,直到达到收敛条件。

pcl::segmentation::detail::RandomWalker用于实现基于随机游走的分割算法,它的原理是将点云分割成多个区域,并将每个区域分配一个标签,分割的过程基于随机游走算法,它会计算点云中所有点之间的距离,并通过比较距离来决定哪些点应该属于同一区域,在分割的过程中,RandomWalker将点云看作是一个图形,每个点作为一个节点,相邻的点之间的距离作为边。通过计算每个节点到其他节点的距离,可以得到一个节点与节点之间距离的权重矩阵,然后根据这个权重矩阵来运行随机游走算法

pcl::LCCPSegmentation用于将点云数据分割为不同的聚类,LCCP代表Local Convexity Concavity Preserving。该模块使用基于图的凸凹保持的方法进行分割,可以识别出由凸面、凹面和平面构成的聚类。

基本原理:该方法使用了一种基于图的分割方法,通过构建一个基于图的表示来对点云数据进行分割,算法的核心是在局部区域中进行凸凹性分析,以保持聚类的局部凸凹性质,具体来说,该算法使用点云数据的曲率信息和邻域信息来计算每个点的凸凹性质,并使用这些信息来构建基于图的表示,然后,使用图论中的标签传播算法,将点云数据分割为不同的聚类,在分割过程中,保留局部凸凹性质,以获得更加准确的聚类结果。

pcl::RegionGrowing使用了一种基于区域增长的方法来分割点云数据,该算法使用一种增长策略,将种子点作为开始点,不断将邻近点添加到同一个区域中,它的主要思路是对于每个种子点,寻找与之相邻的所有点,并将这些点与种子点放在同一个区域中,这样就得到了一个较大的区域,然后,对于每个边缘点,判断它是否应该属于当前区域,并将其添加到区域中,当没有边缘点可以添加到区域时算法结束。

pcl::RegionGrowingRGB是基于RGB颜色信息进行区域生长分割的模块,它基于局部颜色相似性度量邻域内点之间的相似性,并在此基础上将相似的点合并成一个聚类。

pcl::SACSegmentation用于估计点云中符合特定模型的参数以及对应的点集。它支持对于多种基础的模型进行拟合,如平面、球、圆柱、圆锥等,SACSegmentation采用随机抽样一致性(RANSAC)算法来实现,可以在噪声点云数据中快速鲁棒地估计模型参数。该模块使用时主要涉及到以下几个步骤:

  • 1. 选择模型类型:通过设置SACSegmentation对象的模型类型,如SACMODEL_PLANE(平面)、SACMODEL_SPHERE(球)等,来指定需要估计的模型类型。

  • 2. 设置点云数据:将需要进行模型拟合的点云数据通过setInputCloud()函数设置进去。

  • 3. 设置模型拟合参数:通过setModelType()函数来设置模型类型后,可以通过setMethodType()函数来设置模型拟合所采用的方法类型,如SAC_RANSAC(随机抽样一致性)或SAC_LMEDS(最小中值平方差)等。此外,还需要设置一些其他的参数,如采样的最大迭代次数、采样时随机选择的最小点数、距离阈值等。

  • 4. 进行模型拟合:通过调用SACSegmentation对象的segment()函数来进行模型拟合。

  • 5. 获取拟合结果:可以通过调用SACSegmentation对象的getResult()函数来获取拟合的结果,包括拟合的模型参数以及对应的点集等信息。

pcl::SACSegmentationFromNormals用于从带有法向量信息的点云数据中分割出一个特定模型,该模块的原理是基于采样一致性(Sample Consensus,SAC)算法的。

pcl::SeededHueSegmentation是一个基于色调的点云分割算法,它可以根据种子点(seed)和颜色信息将点云分割成多个颜色相似的部分。

pcl::SegmentDifferences它可以用于对两个点云数据进行分割,找出它们之间的差异部分,该模块可以接收两个点云数据,分别为源点云和目标点云,找出两者之间的差异点云。原理是将目标点云数据逐个点与源点云数据进行比较,找出不同点云数据,将不同点云数据打上标记。标记可以是一些自定义的颜色或者其它形式,以便于后续的分析处理。

pcl::SupervoxelClustering是PCL库中用于超像素分割的模块,它基于传统的区域生长方法实现,旨在将3D点云数据分割为连续的超像素群体,以便在处理大规模点云数据时提高计算效率。原理:该算法基于颜色空间中的RGB值和3D坐标信息计算每个超像素的特征,使用k-means算法对特征进行聚类,将相邻的超像素合并到一起形成连续的超像素群体,其中,颜色空间中的RGB值和3D坐标信息是可以自定义的,可以根据不同应用场景自行选择特征信息。

资源

自动驾驶及定位相关分享

【点云论文速读】基于激光雷达的里程计及3D点云地图中的定位方法

自动驾驶中基于光流的运动物体检测

基于语义分割的相机外参标定

综述:用于自动驾驶的全景鱼眼相机的理论模型和感知介绍

高速场景下自动驾驶车辆定位方法综述

Patchwork++:基于点云的快速、稳健的地面分割方法

PaGO-LOAM:基于地面优化的激光雷达里程计

多模态路沿检测与滤波方法

多个激光雷达同时校准、定位和建图的框架

动态的城市环境中杆状物的提取建图与长期定位

非重复型扫描激光雷达的运动畸变矫正

快速紧耦合的稀疏直接雷达-惯性-视觉里程计

基于相机和低分辨率激光雷达的三维车辆检测

用于三维点云语义分割的标注工具和城市数据集

ROS2入门之基本介绍

固态激光雷达和相机系统的自动标定

激光雷达+GPS+IMU+轮速计的传感器融合定位方案

基于稀疏语义视觉特征的道路场景的建图与定位

自动驾驶中基于激光雷达的车辆道路和人行道实时检测(代码开源)

用于三维点云语义分割的标注工具和城市数据集

更多文章可查看:点云学习历史文章大汇总

SLAM及AR相关分享

TOF相机原理介绍

TOF飞行时间深度相机介绍

结构化PLP-SLAM:单目、RGB-D和双目相机使用点线面的高效稀疏建图与定位方案

开源又优化的F-LOAM方案:基于优化的SC-F-LOAM

【开源方案共享】ORB-SLAM3开源啦!

【论文速读】AVP-SLAM:自动泊车系统中的语义SLAM

【点云论文速读】StructSLAM:结构化线特征SLAM

SLAM和AR综述

常用的3D深度相机

AR设备单目视觉惯导SLAM算法综述与评价

SLAM综述(4)激光与视觉融合SLAM

Kimera实时重建的语义SLAM系统

SLAM综述(3)-视觉与惯导,视觉与深度学习SLAM

易扩展的SLAM框架-OpenVSLAM

高翔:非结构化道路激光SLAM中的挑战

基于鱼眼相机的SLAM方法介绍

更多详细内容后台发送“知识星球”扫码加入知识星球查看原文。

智驾全栈与3D视觉学习星球:主要针对智能驾驶全栈相关技术,3D/2D视觉技术学习分享的知识星球,将持续进行干货技术分享,知识点总结,代码解惑,最新paper分享,解疑答惑等等。星球邀请各个领域有持续分享能力的大佬加入我们,对入门者进行技术指导,对提问者知无不答。同时,星球将联合各知名企业发布自动驾驶,机器视觉等相关招聘信息和内推机会,创造一个在学习和就业上能够相互分享,互帮互助的技术人才聚集群。

以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除

扫描二维码

                   关注我们

让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入知识星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。

分享及合作方式:微信“920177957”(需要按要求备注) 联系邮箱:dianyunpcl@163.com,欢迎企业来联系公众号展开合作。

点一下“在看”你会更好看耶

6fd8d629e04f6358f7004a4ce7a0ab54.gif

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用PCL点云实现基于欧几里得聚类的点云分割算法示例代码: ```c++ #include <iostream> #include <pcl/point_types.h> #include <pcl/filters/extract_indices.h> #include <pcl/segmentation/extract_clusters.h> #include <pcl/kdtree/kdtree.h> int main(int argc, char** argv) { // Load point cloud data pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile("input_cloud.pcd", *cloud); // Create KDTree for efficient nearest neighbor search pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>); tree->setInputCloud(cloud); // Create vector for storing cluster indices std::vector<pcl::PointIndices> cluster_indices; // Create EuclideanClusterExtraction object and set parameters pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec; ec.setClusterTolerance(0.02f); // Maximum distance between points in a cluster ec.setMinClusterSize(100); // Minimum number of points in a cluster ec.setMaxClusterSize(25000); // Maximum number of points in a cluster ec.setSearchMethod(tree); ec.setInputCloud(cloud); // Extract clusters ec.extract(cluster_indices); // Print number of clusters found std::cout << "Number of clusters found: " << cluster_indices.size() << std::endl; // Create ExtractIndices object for each cluster and save to file for (int i = 0; i < cluster_indices.size(); ++i) { pcl::ExtractIndices<pcl::PointXYZ> extract; extract.setInputCloud(cloud); extract.setIndices(boost::make_shared<const pcl::PointIndices>(cluster_indices[i])); pcl::PointCloud<pcl::PointXYZ>::Ptr cluster(new pcl::PointCloud<pcl::PointXYZ>); extract.filter(*cluster); pcl::io::savePCDFile("cluster_" + std::to_string(i) + ".pcd", *cluster); } return 0; } ``` 此代码将从名为“input_cloud.pcd”的文件中加载点云数据,使用KDTree进行最近邻搜索并执行欧几里得聚类,最后将每个簇的点保存到单独的PCD文件中。聚类的参数(聚类容差、最小/最大簇大小等)可以根据应用程序的需要进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云PCL公众号博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值