传统的点云分割方法及PCL中的分割模块

参考:https://www.cnblogs.com/li-yao7758258/p/10908980.html

  • 三维点云分割是将同属性的点云物体分割出来,以便于单独对该点云物体处理,但是由于点云数据是一种高冗余度,且不均匀的数据结构,所以点云分割具有一定挑战性。
  • 点云库于(PCL)2011年推出以来,得到行业广泛的应用,该库包含了最先进的3D感知算法,并包含了LIDAR和三维扫描仪的接口,这使得点云库PCL在机器人领域持续不断的发展壮大起来。至今为止已经更新到了1.9.1版本。
  • 在图像分割中常常用到前景与背景的分割处理,而在点云处理中,对于给定点云数据,分割的目标是将具有相似特征的点聚类成均匀区域,根据分割结果应用于各个方面的场景分析,一般的方法是根据输入点云的网格构建图形,使用边界线的法线,平滑度或者是凹凸性等信息进行聚类分割。在文章[1]中调查了分割的方法有:凹凸性分割,分水岭分析,层次聚类,区域增长以及频谱聚类。这些方法不仅是应用图像,也广泛的应用于点云数据的分割。在计算机视觉中,2D图像的分割是一个很经典的问题,并且已经有着十几年的研究历史,其中基于传统的方法比较流行有Graph Cuts[2],包含了Normalized Cuts和Min Cuts 这些方法的思想同样适应于3D点云的分割,并且这部分内容在PCL中都已经开源。

1. 点云分割算法应该具有以下三种重要属性:

(1)比如树木是具有与汽车相区别的特征的,当点云数据的特征数量增加时,分割算法应该具有一定的鲁棒性,能够学习如何自动的区分它们。
(2)其次分割应该能够根据其相邻的信息推断出稀疏点云中这些点的属性或者判定出属于哪个标签。
(3)分割算法应该能适用于不同的扫描器,即便是相同的场景在不同的扫描仪生成出的点云也是具有不同的属性的,并且产生点云的质量以及稀疏性的也是不一样的。

2. 点云分割的挑战:

  • 点云数据虽然可以确定3D对象的形状,大小和一些其他属性,但是3D点云通常由于传感器的限制,数据是嘈杂稀疏且无序的,比如激光雷达线性和角速率的变化,点的采集密度也是不均匀的,此外点云数据的表面形状可以是任意的,是没有数据统计分布呈现出来的。所以这就给点云的分割带来一系列的问题。

3. 传统的点云分割算法:

  • 接下里将介绍五种传统的分割算法:基于边缘的方法,基于区域的方法,基于属性的方法,基于模型的方法和基于图优化的方法。
    在这里插入图片描述

3.1 基于边缘的方法:

  • 边缘是描述点云物体形状的基本特征,这种方法检测点云一些区域的边界来获取分割区域,这些方法的原理是定位出边缘点的强度变化。论文[2]提出了一种边缘检测技术,通过计算梯度,检测表面上单位法向量方向的变化来拟合线段。论文[3]是基于扫描线的分组进行快速分割。
  • 基于边缘的方法虽然分割速度比较快但是准确度不能保证,因为边缘对于噪声和不均匀的或稀疏的点云非常敏感。

3.2 基于区域的方法:

  • 基于区域的方法使用邻域信息来将具有相似属性的附近点归类,以获得到分割区域,并区分出不同区域之间的差异性。基于区域的方法比基于边缘的方法更准确, 但是他们在分割过度或不足以及在如何准确确定区域边界方面存在问题。
  • 研究者们将基于区域的方法分为两类:种子区域(或自下而上)方法和非种子区域(或自上而下)方法。
3.2.1 种子区域方法:
  • 基于种子的区域分割通过选择多个种子点来开始做分割,从这些种子点为起始点,通过添加种子的邻域点的方式逐渐形成点云区域。最初的算法是由论文[4]提出来的,该算法主要包含了两个步骤:(1)基于每个点的曲率识别种子点;(2)根据预定标准,该标准可以是点的相似度和点云的表面的相似度来生长种子点。这种方法对噪声点也非常敏感,并且耗时。但后续有很多基于这种方法的改进,比如对于激光雷达数据的区域增长的方法,提出了基于种子点的法向量和与生长平面的距离来生长种子点。
  • 种子区域方法高度依赖于选定的种子点。不准确选择种子点会影响分割过程,并可能导致分割不足或过度。选择种子点以及控制生长过程是耗时的。分割结果可能对所选的兼容性阈值敏感。另一个困难是决定是否在给定区域中添加点,因为这种方法对点云的噪声也很敏感。
3.2.2 非种子区域方法:
  • 这种方法是基于自上而下的方法。首先,所有点都分为一个区域;然后细分过程开始将其划分为更小的区域。论文[5]使用这种方法指导聚类平面区域的过程,以重建建筑物的完整几何形状。该工作引入了基于局部区域的置信率为平面的分割方法。这种方法的局限性在于它也可能会过度分割,并且在分割其他对象(例如树)时它不能很好地执行。
  • 非种子区域方法的主要困难是决定细分的位置和方式。这些方法的另一个限制是它们需要大量的先验知识(例如:对象模型,区域数量等),然后这些未知的先验知识在复杂场景中通常是未知的。

3.3 基于属性的方法:

  • 该方法是基于点云数据的属性的一种鲁棒性较好的分割方法,这种方法一般包括了两个单独的步骤:(1)第一步,基于属性的计算;(2)第二步,将根据计算点的属性进行聚类。这种聚类方法一般能适应空间关系和点云的各种属性,最终将不同的属性的点云分割出来。但是这种方法局限性在于他们高度依赖派生属性的质量,所以要求第一步能够精确的计算点云数据的属性,这样才会在第二步中根据属性的类别分割出最佳的效果。论文[6]则是这种方法实现的,提出了一种基于特征空间聚类分析方法。在该方法中,使用一种自适应斜率的邻域系统导出法向量,使用点云数据的属性,例如距离、点密度、点在水平或者垂直方向的分布,来定义测量点之间的领域,然后将每个方向上的法向量的斜率和点邻域的数据之差作为聚类的属性,这种方法可以消除异常值和噪声的影响。
  • 基于属性的方法是将点云分割相同属性区域的高效方法,并且分割的结果灵活而准确。然而,这些方法依赖于点之间邻域的定义和点云数据的点密度。当处理大量输入点的多维属性时,这种方法的另一个限制是比较耗时。

3.4 基于模型的方法:

  • 该方法是基于几何的形状比如球形、圆锥、平面和圆柱形来对点云进行分组,那么根据这些形状,具有相同的数学表示的点将会被分割为同一组点,论文[7]中引入了一种众所周知的算法:RANSAC(Random Sample Consensus),RANSAC是强大的模型,用于检测直线、圆等数学特征。这种应用极为广泛且可以认为是模型拟合的最先进技术,在3D点云的分割中需要改进的方法都是继承了这种方法。
  • 基于模型的方法具有纯粹的数学原理,快速且强大,具有异值性,这种方法的主要局限性在于处理不同点云时的不准确性。这种方法在点云库中已经实现了基于线、平面、圆等各种模型。

3.5 基于图优化的方法:

  • 基于图优化的方法在机器人的应用中十分流行,众所周知的方法是:FH算法[7],该方法简单且高效,并且像Kruskal算法一样用于在图中查找最小生成树。许多基于图的方法的工作被投入到概率推理模型中,例如:条件随机场(CRF),使用CRF标记具有不同几何表面基元的点的方法。
  • 基于图优化的方法在复杂的城市环境中成功地分割点云,具有接近实时的性能。为了与其他方法进行比较,基于图形的方法可以对点云数据中的复杂场景进行处理;但是,这些方法通常无法实时运行,其中一些可能需要离线训练等步骤。

-以上将分割方法分为五类。但是,一般来说,有两种基本方法。
-第一种方法是用纯数学模型和几何推理技术,如:区域增长或模型拟合,将线性和非线性模型拟合到点云数据。这种方法允许快速运行时间能实现良好的结果。这种方法的局限性在于在拟合物体时难以选择模型的大小,对噪声敏感并且在复杂场景中不能很好地工作。
-第二种方法是用特征描述子的方法。从点云数据中提取3D特征,并使用机器学习技术来学习不同类别的对象类型,然后使用结果模型对所获取的数据进行分类。在复杂场景中,机器学习技术将优于纯粹基于几何推理的技术。原因是由于噪声、密度不均匀、点云数据中的遮挡,很难找到并将复杂的几何图元拟合到物体上。虽然机器学习技术可以提供更好的结果,但它们通常很慢并且依赖于特征提取过程的结果。
-以上的这些算法在PCL的都已经实现且都有现成的demo可以查看效果。

4. PCL中的点云分割模块:

  • 该模块是在以上基本模块的基础上进行的研究,比如:如何将点云数据构造成kdtree或者Octree结构使用FLANN(最近邻搜索)的方式寻找点与周围点之间的关系。
  • PCL常用的聚类分割的类有以下几种:

4.1

 - class   pcl::ConditionalEuclideanClustering< PointT >

该类实现了用于设定条件的欧式聚类的分类算法。

bool enforceIntensitySimilarity (const pcl::PointXYZI& point_a, const pcl::PointXYZI& point_b, float squared_distance)
{
if (fabs (point_a.intensity - point_b.intensity) < 0.1f)
return (true);
else
return (false);
}
// 以上是一个用于设定的基于两点间的强度信息/ 
pcl::ConditionalEuclideanClustering<pcl::PointXYZI> cec (true);
cec.setInputCloud (cloud_in);
cec.setConditionFunction (&enforceIntensitySimilarity);  
// 此处将我们的条件函数加入
cec.setClusterTolerance (0.09f);   //聚类所能接受程度
// Size constraints for the clusters:
cec.setMinClusterSize (5);   //聚类的大小设置
cec.setMaxClusterSize (30);
// The resulting clusters (an array of pointindices):
cec.segment (*clusters);
// The clusters that are too small or too large in size can also be extracted separately:
cec.getRemovedClusters (small_clusters, large_clusters);

4.2

class  pcl::CPCSegmentation< PointT >

对超体素图进行分割的分割算法。 它使用局部凹度引起的平面切割进行递归分割,使用局部约束的有向RANSAC进行分割。

class   pcl::LCCPSegmentation< PointT >

一种简单的分割算法,将一个超体素图分割成由凹边界分隔的局部凸连接超体素组。相关论文:S. C. Stein, M. Schoeler, J. Papon, F. Woergoetter Object Partitioning using Local Convexity In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR) 2014
在这里插入图片描述
CPC分割与LCCP分割是继承的关系 :具体论文可以查看文献:M. Schoeler, J. Papon, F. Woergoetter Constrained Planar Cuts - Object Partitioning for Point Clouds In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR) 2015

4.3

class  pcl::EuclideanClusterExtraction< PointT >

欧几里得聚类提取是欧几里得意义上的聚类获取分割的点云类。此函数是经常用到的。

4.4

class  pcl::LabeledEuclideanClusterExtraction< PointT >

LabeledEuclideanClusterExtraction表示一个分段类,用于欧几里得意义上的带有标签信息的聚类提取。

4.5

class  pcl::ExtractPolygonalPrismData< PointT >

ExtractPolygonalPrismData使用一组表示平面模型的点索引,并与给定的高度一起生成三维多边形棱柱。然后使用多边形棱柱分割位于其内部的所有点。它的一个使用示例是提取位于一组三维边界内的数据(例如:由平面支持的对象)。

double z_min = 0., z_max = 0.05; // we want the points above the plane, no farther than 5 cm from the surface
pcl::PointCloud<pcl::PointXYZ>::Ptr hull_points (new pcl::PointCloud<pcl::PointXYZ> ());
pcl::ConvexHull<pcl::PointXYZ> hull;
// hull.setDimension (2); // not necessarily needed, but we need to check the dimensionality of the output
hull.setInputCloud (cloud);
hull.reconstruct (hull_points);
if (hull.getDimension () == 2)
{
pcl::ExtractPolygonalPrismData<pcl::PointXYZ> prism;
prism.setInputCloud (point_cloud);
prism.setInputPlanarHull (hull_points);
prism.setHeightLimits (z_min, z_max);
prism.segment (cloud_indices);
}

4.6

class  pcl::GrabCut< PointT >

实现了GrabCut分割。

4.7

class  pcl::segmentation::detail::RandomWalker< Graph, EdgeWeightMap, VertexColorMap >

实现随机行走的多标签图分割。相关论文:Random Walks for Image Segmentation

4.8

class  pcl::SACSegmentationFromNormals< PointT, PointNT >

结合点云的数据表面的法向量使用RANSAC方法的分割。

4.9

class  pcl::SeededHueSegmentation
class  pcl::SegmentDifferences< PointT >

SegmentDifferences获取两个空间对齐的点云之间的差异,并返回它们之间在最大给定距离阈值下的差异。

4.10

class  pcl::SupervoxelClustering< PointT >

实现基于体素结构、法线和RGB值的超体素算法。相关论文:Voxel Cloud Connectivity Segmentation - Supervoxels from PointClouds In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR) 2013

参考文献:

[1] A. Shamir, Segmentation and shape extraction of 3D boundary meshes (state of the art report), in Eurographics, 2006
[2] B. Bhanu, S. Lee, C. Ho, and T. Henderson, Range data processing:Representation of surfaces by edges. In proc.int. Pattern recognition conf, 1896
[3] X.Y. Jiang, H. Bunke, and U. Meier, Fast range image segmentation using high-level segmentation primitives, In 3rd IEEE Workshop on Applications of Computer Vision, USA, 1996
[4] P.J. Besl, R.C. Jain, Segmentation through variable order surface fitting, IEEE Transaction on Pattern Analysis and Machine Intelligence 10, 1988.
[5] J. Chen, B. Chen, Architectural modeling from sparsely scanned range data. Int. J. Comput. Vision 78, 2008.
[6] S. Filin, N. Pfeifer, Segmentation of airborne data using a slope adaptive filter, ISPRS J. Photogramm. Remote Sens., vol. 60, pp. 71- 80, 2006.
[7] M. Fischler, R. Bolles, Random sample consensus: a paradigm for model fitting with applications to image analysis and automated cartography, Communications of the ACM
[8] P.F. Felzenszwalb, D.P. Huttenlocher, Efficient Graph-Based Image Segmentation, International Journal of Computer Vision, 59(2), 2004.

  • 5
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值