学习PCL库:PCL库中filters模块

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

filters模块介绍

PCL库中filters模块主要提供各种滤波器算法来对点云数据进行降噪、采样、平滑等操作,以提高点云数据的质量和准确性。该模块中的主要类和方法包括:

* VoxelGrid:将点云数据进行体素化(voxelization),降低点云的采样率。

* PassThrough:根据一定范围过滤点云数据,过滤掉不在指定范围内的数据。

* StatisticalOutlierRemoval:根据统计学方法去除点云中的离群点(outlier)。

* RadiusOutlierRemoval:根据点云中每个点周围一定半径范围内的点的数量,去除密度较小的点,即稀疏的、孤立的点。

* ConditionalRemoval:根据给定的条件,过滤掉不符合条件的点云数据。

* ExtractIndices:从点云数据中提取指定索引的点云数据。

* ExtractIndices:从点云数据中剔除指定索引的点云数据。

* ProjectInliers:根据模型提供的参数,对点云数据进行投影。

* CropBox:根据指定的三维框体(box)截取包含在框体内的点云数据。

filters模块中的算法主要用于对点云数据进行预处理或后处理,以提高点云数据的质量和精度。以上是常用的滤波方法,随着PCL库的发展目前也加入了更多的滤波算法。下面将详细介绍该模块中的每一个类的功能。

主要内容

pcl::ApproximateVoxelGrid

pcl::ApproximateVoxelGrid是一个体素滤波器,可以用于下采样点云数据,减少点云数据量,提高后续处理的效率。其原理是将点云空间划分为一系列体素,然后将每个体素中的点转换为一个代表点(例如重心),从而实现点云的下采样。与标准的体素滤波器不同,ApproximateVoxelGrid采用了一种加速方法,首先将点云数据按照三个维度分别排序,然后按照一定的步长将每个体素代表点与相邻的体素代表点合并,从而实现点云的下采样。即将点云空间划分为一系列网格,使得相邻的体素可以共享相同的代表点,从而提高了计算效率。

可参考论文:《Real-Time 3D Model Acquisition》。

pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
// 读取点云数据
pcl::ApproximateVoxelGridvoxel_filter;
voxel_filter.setInputCloud(cloud);
voxel_filter.setLeafSize(0.01f, 0.01f, 0.01f); // 设置体素大小
pcl::PointCloud::Ptr filtered_cloud(new pcl::PointCloud);
voxel_filter.filter(*filtered_cloud); // 进行下采样

pcl::BilateralFilter

pcl::BilateralFilter是基于双边滤波(Bilateral Filter)算法实现。双边滤波是一种能够保留图像细节信息的非线性滤波方法,它在空间域和像素值域同时进行滤波。相对于高斯滤波,双边滤波能够更好地保留图像的边缘信息,同时也能够去除噪声和平滑图像。具体实现方法中,该算法使用KD-Tree来快速搜索滤波半径内的邻居点,计算空间距离和颜色相似性,并进行加权平均得到滤波后的点的位置和颜色值。

pcl::BoxClipper3D

pcl::BoxClipper3D用于剪裁点云数据并只保留落在指定三维框中的点。通过遍历点云中的每个点,并检查它是否在指定的三维框内。这个框可以由框的最小值(xmin、ymin、zmin)和最大值(xmax、ymax、zmax)定义。如果一个点的x、y和z坐标都在指定的范围内,则保留该点,否则将其删除。

pcl::ConditionalRemoval

pcl::ConditionalRemoval类用于条件点云的过滤,它能够根据给定的条件过滤点云中的点。例如,可以通过给定一个条件,来过滤掉点云中距离某个平面较远的点,能够帮助用户快速准确地过滤掉点云中无用的或者干扰性的点,提高点云处理的效率和准确性。实现方法主要是遍历点云中的每个点,检查每个点是否满足条件,如果不满足,则将其从点云中移除。对于条件的定义,可以通过设置函数setCondition()来完成。在这个函数中,可以定义一个条件函数,用于检查每个点是否满足条件。例如,可以定义一个距离条件函数,检查每个点到某个平面的距离是否小于一个给定的值,如果小于,则保留该点,否则将该点从点云中移除。

pcl::filters::Convolution

pcl::filters::Convolution用于对点云数据进行卷积滤波,该滤波器可以用于提取点云中的特定特征,如曲率,以及进行形态学操作等。卷积滤波器是通过将核函数与图像进行卷积来实现图像处理的一种技术,在点云数据中,卷积滤波器可以通过将核函数应用于每个点周围的邻域来计算每个点的新属性值,常用的核函数包括高斯核函数和Sobel核函数。

pcl::filters::ConvolvingKernel 

pcl::filters::ConvolvingKernel 实现卷积操作的类,用于对点云数据进行滤波、增强、边缘检测等操作。卷积是一种在信号处理、图像处理、计算机视觉等领域中广泛应用的数学运算,可以通过将两个函数做积分的方式得到一个新的函数。在图像处理中,卷积通常用于平滑、锐化、边缘检测等操作。卷积运算可以看作是对一个像素点的加权求和,其中每个权值对应一个卷积核中的元素。pcl::filters::ConvolvingKernel 类定义了一个卷积核,可以对输入的点云数据进行卷积操作。它提供了一组预定义的卷积核,包括高斯核、Sobel核、Prewitt核等,用户也可以自定义卷积核。该类还提供了一些卷积操作的辅助函数,如归一化、计算卷积核权值等。

pcl::filters::GaussianKernel 

pcl::filters::GaussianKernel 是高斯核的实现类,高斯核是一种常用的卷积核,可以在图像处理中用来进行模糊化、降噪等操作。在点云处理中,高斯核可以用来进行平滑化操作,减小噪声的影响。pcl::filters::GaussianKernel 类中实现了高斯核的生成函数 generate。该函数的输入为高斯核的标准差(standard deviation),以及核的尺寸(size)。生成函数首先计算出高斯核的系数,然后根据系数计算出高斯核的数值。由于高斯核的应用十分广泛,涉及到的相关论文也很多。其中《A Comparison of Gaussian and Mean Curvature Estimation Methods on Triangular Meshes》论文主要比较了在三角网格上应用高斯核和平均曲率估计方法的优缺点,对于深入理解高斯核的应用有一定的参考意义。

pcl::CropBox

pcl::CropBox用于从点云数据中裁剪出一个指定的立方体区域,该类可以用于提取感兴趣的区域或者过滤掉不需要的区域。实现方法是基于PCL库中的AxisAlignedBoundingBox类,该类用于表示一个平行于坐标轴的立方体,CropBox通过指定一个AxisAlignedBoundingBox,将在这个立方体内的点云保留下来,不在这个立方体内的点云则被过滤掉。在CropBox类的构造函数中,需要指定立方体的中心点和大小,以及立方体的旋转角度,CropBox会将立方体进行变换,然后将变换后的立方体与点云进行比较,最终确定哪些点云应该被保留下来,哪些应该被过滤掉。

pcl::CropHull 

pcl::CropHull 用于从点云中剪裁出一个凸包(Convex Hull)内的点,它继承自 pcl::PCLBase,可以使用点云中的 pcl::PointXYZ 类型。该类的主要原理是首先计算点云的凸包,然后在凸包中寻找一个包含点云的最小多面体,最后输出该多面体内的点。这个类的应用场景主要是在需要提取点云数据中某个区域时使用,例如在三维重建中,可以使用该类滤波器将点云中非物体区域的点剪裁掉,只保留物体区域内的点,以便后续处理。

pcl::experimental::advanced::FunctorFilter 

pcl::experimental::advanced::FunctorFilter 它允许用户自定义一个函数对象(Functor)来执行滤波操作,该滤波器被设计为一个通用的滤波器,可以被用于各种数据类型的点云,例如XYZ、Normal、Intensity等等。

实现方法:

1. 定义Functor对象:用户需要定义一个Functor对象,并实现它的函数操作符(operator())来执行具体的滤波操作。

2.定义FunctorFilter对象:在定义pcl::experimental::advanced::FunctorFilter对象时,需要传入一个Functor对象作为参数。

3. 执行滤波操作:通过调用pcl::experimental::advanced::FunctorFilter::filter函数来执行滤波操作,该函数会遍历输入点云,并对每个点调用Functor对象的函数操作符来执行滤波操作。

pcl::ExtractIndices

pcl::ExtractIndices用于提取点云中的特定索引或者删除特定索引对应的点。该滤波器实现了PCL的Filter接口,支持使用PCL的pipeline进行滤波操作。它将输入点云中的每个点与一个给定的索引列表进行比较,如果该点在索引列表中,则将其保留在输出点云中,如果不在索引列表中,则将其丢弃。

pcl::FarthestPointSampling

pcl::FarthestPointSampling用于从点云中均匀采样一些关键点,以减少点云数据的规模,同时保留其结构和特征。Farthest Point Sampling算法的主要思想是,从点云中选取一些具有代表性的点作为关键点,以尽可能减少点的数量,同时保留点云的特征,在开始时,随机选取一个点作为第一个关键点,然后,算法从点云中选择到该点的最远距离的点作为下一个关键点,并将其加入到最终的关键点集合中,对于选择下一个关键点,算法将每个点与已选择的关键点之间的距离计算出来,然后选取距离最大的点作为下一个关键点,以此类推,直到达到所需的关键点数量。Farthest Point Sampling的算法思想最初由J. B. ten Berge在1977年的论文《The shortest path algorithm and a homotopy algorithm for spherical Voronoi diagrams》中提出,在计算机图形学领域,该算法被广泛应用于点云采样、曲面重建和点云配准等问题。

pcl::FrustumCulling 

pcl::FrustumCulling 用于根据一个视锥体(frustum)来对点云数据进行裁剪,只保留在视锥体内的点。视锥体(frustum)是一个用于表示摄像机视场范围的椎体,是一个由六个平面组成的六面体。对于每个点,只需计算其是否在视锥体内,如果在,则保留,否则将其剔除。

pcl::GridMinimum 

pcl::GridMinimum 类是一个计算点云最小曼哈顿距离网格的滤波器,它主要用于计算点云中每个点与其最近邻之间的最小曼哈顿距离,曼哈顿距离是指两个点在各坐标轴上的差的绝对值之和,该滤波器的输出是一个网格,网格中的每个元素代表点云中每个点与其最近邻之间的最小曼哈顿距离。实现方法主要是将点云划分成一个个网格,对于每个网格,找到其中的最小距离,并将其保存到网格的中心点处,具体实现时,可以通过指定网格大小、网格数量等参数来控制网格的大小和密度,当点云中的点数量较大时,这种方法可以有效地降低计算量,提高计算效率。

pcl::LocalMaximum

pcl::LocalMaximum它可以用于查找点云中的局部极大值,在点云处理中,局部极大值通常表示关键点或者重要特征点,pcl::LocalMaximum使用的方法是基于栅格化技术实现的,具体来说,它将点云数据集转换为一个三维网格(voxel grid),并在每个栅格中查找局部最大值,这个过程类似于局部区域的最大值滤波器,但不同之处在于,它仅考虑局部最大值,通过这种方式,它可以有效地捕捉点云中的局部特征,例如边缘、几何特征等。

pcl::MedianFilter

pcl::MedianFilter用于对点云数据进行中值滤波,中值滤波器是一种非线性滤波器,通过用局部窗口内的中值替换每个像素的值来减少图像中的噪声,在点云中,中值滤波器通过将每个点的坐标替换为周围邻居点的中值来减少噪声,中值滤波器的主要思想是将一个窗口(kernel)移动到点云上的每个点,并用窗口内点的中值替换当前点的值,这里,中值是窗口中所有值的排序后的中间值。

pcl::NormalRefinement

在点云数据处理中,法向量估计是很重要的一步。而由于某些因素(如噪声、采样密度不均匀等),估计出来的法向量可能会有一些不准确或者不完整的地方,这时候就需要对法向量进行精细化的调整和修正,这就是法向量细化(normal refinement)。PCL库中pcl::NormalRefinement

就是用于法向量细化的类。其主要功能是对输入点云的法向量进行进一步的优化,以提高法向量估计的准确性。

pcl::NormalRefinement采用了一种迭代优化的方法对法向量进行细化。具体来说,该方法首先对每个点的法向量进行初始估计,然后在每一次迭代中,通过考虑该点周围的邻居点,重新计算该点的法向量。这个过程会迭代多次,直到法向量收敛。在每一次迭代中,可以通过不同的权重系数来调整邻居点的影响程度,以得到更好的结果。

pcl::NormalSpaceSampling

pcl::NormalSpaceSampling它可以在点云中基于法向量的采样,能够有效地减少采样点的数量,同时保持点云特征。pcl::NormalSpaceSampling的原理基于法向量的局部特征,该算法首先计算每个点的法向量,然后基于法向量所描述的空间对点云进行采样,对于点云中的每个点,算法会构建一个局部坐标系,其中法向量作为z轴,x和y轴可以是任意两个垂直于法向量的向量,然后,将点云投影到该局部坐标系中,并将二维平面进行采样,得到采样点云,最后,将采样点云转换回全局坐标系。

pcl::PassThrough

pcl::PassThrough用于将点云数据沿着某个轴方向(或坐标轴)进行截取,只保留给定范围内的点云数据。例如,可以将点云数据截取在某个高度范围内,或者只保留某个区域内的点云数据。

pcl::PassThroughpass;
pass.setInputCloud (cloud);
pass.setFilterFieldName ("z");
pass.setFilterLimits (0.0, 1.0);

pcl::PlaneClipper3D

pcl::PlaneClipper3D 类提供了平面剖切的功能,在点云处理中,经常需要移除不需要的部分,例如一个平面,这时可以使用平面剖切的方法。原理是根据输入的点云和指定的平面方程,将点云中位于平面上或者平面之上的点保留下来,其余点剔除掉,平面方程可以表示为 ax+by+cz+d=0,其中(a,b,c)为平面法向量,(x,y,z)为点的坐标,d为平面到原点的距离。在点云中,点的坐标是(x,y,z),根据平面方程求出该点到平面的距离:d=ax+by+cz+d,如果该距离大于0,则该点在平面之上,应该被保留下来,否则就应该被剔除掉。

pcl::ProjectInliers

pcl::ProjectInliers用于将点云数据投影到给定模型的内部,例如将点云数据投影到平面或直线模型的内部,本质上,该滤波器是一种投影变换,将点云中的每个点映射到给定模型上最近的点, 对于点云中的每个点,该滤波器首先计算其到给定模型的距离,然后将其投影到模型上最近的点,这个距离计算是通过使用PCL库中的pcl::SampleConsensusModel类中定义的求解方法来实现的,这个类可以定义多种类型的模型,例如平面、直线和圆柱等。

pcl::RadiusOutlierRemoval

pcl::RadiusOutlierRemoval用于从点云数据中删除距离过远的离群点,该算法基于半径距离判断,与目标点的距离超出给定半径的点将被视为离群点并被删除。算法采用了两个重要参数:搜索半径(r)和最小邻居点数(min neighbors)。对于每个点,该算法会在以该点为中心的球形邻域内寻找其最近邻点,并根据其最近邻点的数量和距离判断该点是否为离群点,如果该点的最近邻点的数量小于min neighbors,则该点被视为离群点;如果该点的最近邻点中距离最远的点的距离大于r,则该点也被视为离群点,被判定为离群点的点将会被移除。

pcl::RandomSample

pcl::RandomSample用于随机下采样点云数据,下采样可以有效地减少点云数据的数量,减轻点云处理的计算负担,并且可以去除一些噪声点。它随机从输入点云中选取一些点作为输出点云,从而实现下采样,用户可以设置采样的比例或者采样的点数。

pcl::RandomSamplerandom_sample; 

random_sample.setInputCloud(cloud); 

random_sample.setSample(0.5); // 采样比例为50% 

pcl::PointCloud::Ptr output(new pcl::PointCloud); 

random_sample.filter(*output);

pcl::SamplingSurfaceNormal

pcl::SamplingSurfaceNormal主要用于对点云进行采样,能够对原始点云进行下采样处理,并保留原始点云中的重要信息,在点云处理过程中,常常需要对点云进行下采样处理,以减少数据量和提高处理速度,同时又需要保留点云的重要信息,如表面法线信息等。pcl::SamplingSurfaceNormal就是基于点云表面法线的一种采样滤波器。该算法的原理是,在输入的点云中计算每个点的法线,并将法线作为点的描述符,然后利用k-d tree对法线进行聚类,将每个聚类的中心点作为一个代表点,保留该代表点的原始索引,最后将代表点的索引作为下采样后的点云的索引。

pcl::ShadowPoints

pcl::ShadowPoints用于检测并去除点云中的阴影点,在处理激光雷达或摄像头采集的点云数据时,由于光照条件和物体表面形状的影响,会出现一些阴影点,这些阴影点对于后续的点云分析和处理会产生干扰,因此,使用pcl::ShadowPoints可以很好地去除这些阴影点,从而提高点云数据的质量。实现方法是基于深度图像的比较,首先,将点云投影到一个深度图像上,根据光照条件和物体表面形状的影响,深度图像上会出现一些阴影区域。然后,使用一个滑动窗口在深度图像上扫描,比较窗口内的像素值与窗口周围的像素值的大小关系,如果窗口内的像素值比周围的像素值小,则认为该像素点是阴影点。最后,将被标记为阴影点的点从点云中去除。pcl::ShadowPoints的实现方法就是基于这篇论文的方法实现的"Shadow detection and removal for outdoor point clouds based on depth map analysis",作者为Guillaume-Alexandre Bilodeau等人,发表于2013年的IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)。这篇论文提出了一种基于深度图像分析的点云阴影检测和去除方法,并在多个不同场景下进行了测试和验证。

pcl::StatisticalOutlierRemoval

pcl::StatisticalOutlierRemoval用于从点云中去除离群点(outlier)。该滤波器利用统计学原理,计算每个点在其局部邻域内的距离均值和标准差,判断该点是否为离群点,如果是则将其移除。

pcl::UniformSampling

pcl::UniformSampling用于对点云进行均匀采样,在3D点云处理中,由于点云密度不均匀,因此需要对点云进行采样,在点云采样中,均匀采样是一种常见的方法,它可以将点云稀疏化,同时保留其表面的几何形状。pcl::UniformSampling就是一种基于均匀采样的点云滤波器。采用了二叉搜索树(kd-tree)结构来对输入点云进行采样,具体地,它将输入点云分割为一个个小立方体(voxel),然后从每个立方体中随机选择一个点作为采样点,如果一个立方体内部没有点,则不会选择采样点。用户需要指定采样点之间的距离阈值,即采样点之间的距离应大于等于该阈值,这个距离阈值决定了最终采样的点云的密度和精度,较小的距离阈值会生成较密集的采样点,但是可能会导致采样点过多,影响运行效率;而较大的距离阈值会减少采样点的数量,但是可能会导致采样点不足,影响结果精度。

pcl::VoxelGrid 

pcl::VoxelGrid 它可以将点云数据离散化到一个三维体素网格中,并将体素内的所有点云采样为一个中心点,它可以通过减少采样密度的方式来降低点云数据量,从而加快点云处理速度和减少噪声。主要原理是将点云数据离散化到一个三维体素网格中,并将每个体素内的所有点云采样为一个中心点。该滤波器首先计算每个点在体素网格中的位置,然后将所有点按照其所在体素的索引进行分组,每个体素只保留其中一个中心点,这样就可以通过降低采样密度来减少点云数据量,从而提高点云处理的效率。

pcl::VoxelGridOcclusionEstimation 

pcl::VoxelGridOcclusionEstimation 用于提取点云表面的空洞信息,是基于三维体素栅格(Voxel Grid)滤波器实现的,它将点云划分为规则的立方体网格,将网格内的所有点映射到网格中心的体素点,当点云密度较高时,这种方法可以大大降低点云的数量,同时保留点云的基本特征。该算法的主要思路是,先对输入点云进行体素栅格下采样,然后对下采样后的点云进行边界估计,根据体素内的点和估计的表面法线,判断体素是否在点云表面的内部,最终,算法会将所有位于空洞内部的体素标记为无效。具体参考 John Amanatides and Andrew Woo, A Fast Voxel Traversal Algorithm for Ray Tracing

资源

自动驾驶及定位相关分享

【点云论文速读】基于激光雷达的里程计及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,欢迎企业来联系公众号展开合作。

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

55fc00dc39896da91e7e20d81d30363a.gif

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

点云PCL公众号博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值