分享

学习PCL库:PCL库中surface模块

 点云PCL 2023-03-24 发布于上海

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

surface模块介绍

PCL库中的surface模块提供了各种表面重建和拟合算法,根据任务的不同包含一下内容:

  • 可以实现外壳、网格表示的表面重建,带有法线的平滑/重采样表面等功能。

  • 如果点云有噪声或由多个未完全对齐的点云组成,则平滑和重采样同样很重要,可以调整表面估计的复杂性,并在需要时估计法线等功能。

  • 网格化是将点创建成表面的通用方法,目前提供了两种算法:原始点的三角剖分非常快,而较慢的网格化还进行平滑和填补孔洞,创建凸或凹壳在需要简化表面表示或提取边界时也很有用,可以帮助用户对点云数据进行各种表面拟合和分割操作。

主要内容

下面是该模块中一些常用类中实现的算法的概述

pcl::ConcaveHull

该类是PCL库中用于生成点云数据的凸壳的类。在点云处理中,凸壳(convex hull)是一种常见的处理方式,它可以将点云数据包围在一个封闭的外壳中,该外壳完全由凸面体构成。这个类可以生成一个点云的凸壳,同时还能保留凹面部分,这在某些应用场景下是非常有用的。该算法的原理是先根据输入点云创建一个Delaunay三角剖分(Delaunay triangulation),再通过迭代逐渐减小三角剖分的大小,将凹陷部分的点逐渐融合,直到最后形成一个平滑的封闭曲面。该算法相对于传统的凸壳生成算法,具有更好的形状逼近能力和准确性。

该算法基于以下两篇论文:

1. M. Kazhdan, H. Hoppe. Screened Poisson Surface Reconstruction. ACM Transactions on Graphics (Proceedings of SIGGRAPH), 2006.

2. P. J. Besl and R. C. Jain. Three-dimensional object recognition using spherical wavelets. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1995.

这两篇论文都是关于三维点云处理的基础论文,对于点云的凸壳生成和表面重构都有很好的阐述。其中第一篇论文提出了一种Poisson重构方法,用于重构点云数据,并生成平滑的三维表面。第二篇论文则提出了一种基于小波分析的三维目标识别方法,可以用于点云数据的特征提取和描述,这两篇论文都为该算法提供了一定的理论支持。

pcl::ConvexHull

该类用于生成点云的凸包。凸包是一个封闭的凸多边形或凸多面体,它是包含给定点集的最小凸体积或凸面积的集合。在计算机视觉和机器人领域,凸包广泛应用于物体识别、图像分析和机器人路径规划等任务中。

pcl::ConvexHull实现的主要方法是QuickHull算法,这是一种非常快速和有效的凸包生成算法。该算法的主要思想是将点云分成两部分:凸包表面和不在凸包表面上的点。然后在凸包表面上找到最远的点,以构建一个新的凸包表面。不断重复这个过程,直到找到所有在凸包表面上的点。QuickHull算法的时间复杂度为O(n log n),其中n是点云的大小。

该类的主要函数是pcl::ConvexHull::reconstruct(),它接受一个输入点云并生成一个凸包。在实现过程中,该类还包括一些辅助函数,如计算点与凸包表面之间的距离、计算凸包的面积和体积等。此外,该类还提供了一些参数来调整凸包生成的精度和效率,如最大迭代次数、面积阈值和体积阈值等。

pcl::ConvexHull和pcl::ConcaveHull的区别与联系

pcl::ConvexHull和pcl::ConcaveHull都是PCL库中用于点云表面重建的工具,但是它们有几个重要的区别:

  1. 几何形状:ConvexHull生成的是凸壳(convex hull),这意味着所有生成的面都是凸的,而ConcaveHull则生成的是凹壳(concave hull),这意味着生成的面可以是凸的也可以是凹的。因此,ConcaveHull可以更准确地保留点云表面的细节。

  2. 算法复杂度:ConvexHull的算法复杂度通常比ConcaveHull低,因为凸壳的生成算法相对简单。而ConcaveHull的算法复杂度通常更高,因为需要考虑点云表面的曲率变化等细节。

  3. 参数设置:ConvexHull通常只需要设置一个参数,即构建凸壳的方法(例如Qhull或者OpenCV的convexHull)。而ConcaveHull则需要设置更多的参数,例如曲率阈值、网格密度等,以控制生成凹壳的质量和细节。

  4. 应用场景:由于ConcaveHull可以更准确地保留点云表面的细节,因此通常用于需要高精度表面重建的应用场景,例如三维建模、虚拟现实等。而ConvexHull则通常用于需要快速简化点云的应用场景,例如碰撞检测、体积计算等。

两者对同样点云的处理对比如下:“凹壳”对点云的形状描述比“凸壳”更准确。

参考文献

https://www./ET_GeoWizards/UserGuide/concaveHull.htm#ToolBox_implementation

pcl::EarClipping

该类是用于实现2D平面上多边形的三角剖分,三角剖分是将一个多边形分割为一组三角形的过程,其中每个三角形都由三个不共线的点定义。pcl::EarClipping算法是一种基于耳朵切割的方法,用于对简单的多边形进行三角剖分,简单多边形是一种不相交且没有内部空洞的封闭多边形。该算法最初是由David E. G. Johnson在其论文"Efficient Algorithms for Shortest Paths in Planar Graphs"中提出的。该算法还被广泛应用于计算机图形学和CAD领域,例如在OpenGL的Tessellation功能中使用。关于此算法的实现的详细解释可查看此文

https://www./Documentation/TriangulationByEarClipping.pdf

pcl::GreedyProjectionTriangulation

该类用于从点云数据中重建三角网格模型,其原理是使用贪心的策略,从点云数据中生成三角网格模型。该算法的主要步骤如下:输入点云数据和一组参数,包括搜索半径、表面法向量估计半径、最小和最大角度、最小和最大曲率、最大边长和最小边长。对于点云中的每个点,使用搜索半径内的所有邻居点来计算其表面法向量。为每个点创建一个投影圆,其中心是该点的位置,半径等于搜索半径。该投影圆表示为一个2D多边形。对于每个点,从其邻居点的投影圆中选择一个最佳匹配的投影圆。最佳匹配是通过计算两个投影圆之间的距离、法向量夹角和曲率之间的差异来确定的。将最佳匹配的投影圆连接到该点的投影圆,形成一个三角形。该三角形的法向量和曲率是通过加权计算邻居点的法向量和曲率得到的。重复上面的步骤,直到所有的点都被连接成三角形。贪婪三角化后的结果如下图

pcl::GreedyProjectionTriangulation算法的实现基于参考论文:

* Kazhdan, M., Bolitho, M., & Hoppe, H. (2006). Poisson surface reconstruction. In Proceedings of the fourth Eurographics symposium on geometry processing (pp. 61-70).

* Marton, Z. C., & Fromherz, T. (2010). On-the-fly adaptation of 3D reconstruction parameters through shape from silhouette. Autonomous Robots, 28(1), 107-119.

pcl::GridProjection

该类是一个基于栅格的点云投影算法,可以将点云投影到二维平面上,生成一个栅格化的深度图像。它可以用于建立稠密地图或者二维平面检测,比如障碍物检测和人行道检测等。该算法的基本思路是将三维点云分布在三维栅格中,通过统计每个栅格中的点数和距离,得到每个栅格的深度信息,从而形成一个深度图像。具体步骤如下:定义栅格网格大小、范围和分辨率,将三维点云分配到对应的栅格中;对每个栅格,计算其中所有点的平均深度和最小深度;对于没有点云的栅格,填充一个无穷远的默认深度值;可以选择对深度图像进行平滑处理,然后生成一个灰度图像。生成的深度图像可以通过 OpenCV 等库进行处理,比如使用边缘检测算法提取出障碍物的边界。其实现的参考论文

* Ruosi Li, Lu Liu, Ly Phan, Sasakthi Abeysinghe, Cindy Grimm, Tao Ju. Polygonizing extremal surfaces with manifold guarantees. In Proceedings of the 14th ACM Symposium on Solid and Physical Modeling, 2010.

pcl::MarchingCubes

该类用于将3D点云数据转换为三角网格模型,它基于Marching Cubes算法,该算法是一种常用的将等值面(isovalue surface)转换为三角网格的算法。算法的基本思想是将空间分成很多个小的立方体单元(voxels),并根据等值面的位置决定每个单元的三角化方式,在Marching Cubes算法中,每个单元有8个顶点,每个顶点都有一个标量值,这个标量值代表在该顶点处的密度或者颜色值等。根据这些顶点的标量值,可以判断该单元是否被等值面穿过,若是,则将该单元三角化。pcl::MarchingCubes类就是实现了这一算法,它可以将点云数据进行体素化,然后根据等值面的位置将每个体素三角化,最终得到三角网格模型。此外,pcl::MarchingCubes还支持设置多个等值面(isovalue),可以得到多个等值面对应的三角网格模型。参考论文:

* William E. Lorensen, Harvey E. Cline. Marching Cubes: A High Resolution 3D Surface Construction Algorithm. Computer Graphics, Vol. 21, No. 4, July 1987.

Kinfu一种基于Kinect实现的三维重建算法中使用 MarchingCubes的结果,如下图

pcl::MarchingCubesHoppe

该类是基于 Hoppe 的论文《Surface Reconstruction from Unorganized Points》中提出的 Marching Cubes 算法的改进。与 Marching Cubes 算法一样,MarchingCubesHoppe 算法也是从体素网格开始重建,算法首先将点云数据集与一个三维网格进行采样,采样后的网格中的每个体素都是一个立方体,并分别与点云中的点进行比较,确定其是否为表面点,接下来,算法使用 Marching Cubes 算法生成立方体的三角网格表面。Hoppe 在原始 Marching Cubes 算法的基础上提出了一些改进,以便更好地重建曲面。主要的改进如下:

  • 使用距离加权平均法(distance-weighted average)计算法线方向。原始算法使用了双线性插值,而 Hoppe 发现这种方法会导致法线方向出现明显的伪影。

  • 使用曲面法向量(oriented surface normals)进行顶点合并。原始算法只是简单地对顶点坐标进行合并,这会导致三角形表面法向量不一致的情况。使用曲面法向量可以更好地保持三角形表面法向量的一致性,从而得到更好的表面重建结果。

pcl::MarchingCubesHoppe与pcl::MarchingCubes 方法上的区别

pcl::MarchingCubesHoppe 的实现方法与 pcl::MarchingCubes 类似,也是使用体素网格和 Marching Cubes 算法进行表面重建。唯一的区别是,pcl::MarchingCubesHoppe 会在 Marching Cubes 生成三角网格表面时,使用距离加权平均法计算法线方向,并使用曲面法向量进行顶点合并。具体来说,算法首先将点云数据集与一个三维网格进行采样,生成一个体素网格。接着,对于每个体素,算法判断其中心点是否为表面点,以及在哪些方向上存在交叉点。根据表面点和交叉点的位置,使用 Marching Cubes 生成三角网格表面。生成的三角网格表面可以直接用于渲染或进行其他进一步处理。参考Hoppe 等人的论文《Surface Reconstruction from Unorganized Points》提出了 Marching Cubes 算法的改进,其中 pcl::MarchingCubesHoppe 就是基于该论文提出的改进。

pcl::MarchingCubesRBF

该类用于从点云数据中重建出网格表面。它的原理和实现方法与标准的Marching Cubes算法类似,但是使用了基于径向基函数(RBF)的插值方法来计算每个网格顶点的位置和法线。Marching Cubes是一种经典的算法,用于将等值面从三维数据中提取出来。它将体素网格化并对每个体素进行分类,然后根据分类结果构建三角形网格来表示等值面。但是在一些情况下,标准的Marching Cubes算法可能会导致网格表面出现锯齿状的不连续性,或者无法正确地处理噪声或者空洞等问题。为了解决这些问题,使用了RBF插值方法来计算每个网格顶点的位置和法线,从而得到更加平滑和连续的网格表面。具体来说,pcl::MarchingCubesRBF将每个体素内部的点与体素表面上的点进行加权平均,以计算体素表面上每个顶点的位置和法线。这些加权平均值使用了径向基函数,它是一种基于距离的函数,可以将点之间的距离映射到权重值上。pcl::MarchingCubesRBF支持多种不同类型的径向基函数,包括高斯函数和多项式函数等。参考论文:

Partially based on: Carr J.C., Beatson R.K., Cherrie J.B., Mitchell T.J., Fright W.R., McCallum B.C. and Evans T.R., "Reconstruction and representation of 3D objects with radial basis functions" SIGGRAPH '01

pcl::MovingLeastSquares (MLS)

该类是一个重要的点云数据处理算法,它可以对输入点云数据进行平滑、曲面拟合和曲面重建等操作。MLS算法可以将一个离散点集转化为一个连续曲面,同时可以估计每个点的法向量。MLS算法的主要优点是可以处理高度噪声的点云数据,并能够拟合具有复杂形状的曲面。MLS算法主要基于局部最小二乘法,其原理是通过在每个数据点的邻域内进行局部多项式拟合来计算平滑的曲面。该算法首先确定每个数据点的局部邻域,并计算其最小二乘平面拟合。然后,通过将数据点投影到该平面上,可以计算出每个数据点的偏移量,并且可以根据这些偏移量生成一个新的平滑点云。在MLS算法中,点云数据的平滑程度可以通过设置参数进行调整。该算法还可以通过选择不同的拟合函数来适应不同的曲面形状。最常见的拟合函数是高斯权值函数和多项式函数。

"Computing and Rendering Point Set Surfaces" by Marc Alexa, Johannes Behr, Daniel Cohen-Or, Shachar Fleishman, David Levin and Claudio T. Silva www.sci.utah.edu/~shachar/Publications/crpss.pdf

不同MLS参数平滑重建后的效果对比

pcl::OrganizedFastMesh

该类用于从有组织点云数据中快速生成网格,它使用了一种基于区域生长的方法,该方法使用有序点云数据的优势来加速生成网格,该算法可以在较短时间内生成高质量的三角形网格,因此适用于实时应用和大型点云数据集。算法原理:pcl::OrganizedFastMesh算法基于基于区域增长的方法。在这个过程中,点云被分成许多相似的区域,然后将这些区域连接起来以形成网格。这个过程类似于计算机视觉中的图像分割。这种方法的主要优点是可以利用有序点云的结构来加速计算,并减少噪声和离群点的影响。该算法中使用的区域增长方法具有很好的可扩展性和鲁棒性,并且能够在短时间内处理大型数据集。该算法主要包括以下几个步骤:将有序点云数据分成许多相似的区域,以形成种子点集;使用基于区域生长的方法来扩展每个种子点集,以生成一个多边形;将这些多边形组合在一起,以生成最终的三角形网格。参考论文:

D. Holz and S. Behnke. Fast Range Image Segmentation and Smoothing using Approximate Surface Reconstruction and Region Growing. In Proceedings of the 12th International Conference on Intelligent Autonomous Systems (IAS), Jeju Island, Korea, June 26-29 2012

RGB-D点云上的表面重建和平面分割示例,其中应用到了这种重建方法可以更好的实现分割,如下图

pcl::Poisson

基于Poisson重建算法,可以将无序点云数据转换为平滑的三角网格表面模型。Poisson重建算法是一种基于采样点的表面重建算法,能够从点云中计算出连续、光滑的曲面。该算法将点云转换为离散的标量场,并利用Poisson方程求解该标量场的梯度。通过对梯度场进行零交叉算法,可以得到表面的等值面。在PCL库中,pcl::Poisson类将点云数据作为输入,并使用最小二乘法来计算点云的梯度。然后,使用泊松重建算法计算梯度场的等值面,并将其输出为三角网格模型。PCL库中的pcl::Poisson类还提供了许多参数,例如输出网格的分辨率、深度等级和平滑度等,可以根据需要进行调整。此外,还可以使用其他参数来调整算法的准确性和速度。该算法最初由Michael Kazhdan和Matthew Bolitho在2006年提出,并于2013年发表了相关论文。在PCL库中的实现是基于他们的算法,并经过了多次改进和优化。该算法在表面重建领域中得到了广泛的应用,并在实际应用中取得了良好的效果。参考文献

* Michael Kazhdan, Matthew Bolitho, Hugues Hoppe, "Poisson surface reconstruction", SGP '06 Proceedings of the fourth Eurographics symposium on Geometry processing

使用最大树深度为11运行泊松算法重建米开朗基罗的《大卫》头部的几张图像

pcl::CloudSurfaceProcessing

pcl::CloudSurfaceProcessing类是用于表面处理和分割的通用框架。其实现方法基于基于点云的表面重建技术,如法向量估计、曲面拟合和三角剖分。它可以用于各种表面处理和分割任务,如平面、圆柱体、球体等基元几何形状的拟合,以及曲面上的局部和全局形状描述。参考论文:

1. M. Kazhdan, M. Bolitho, and H. Hoppe. Poisson surface reconstruction. In Symposium on Geometry Processing, pages 61–70, 2006.

2. N. Amenta, M. Bern, and D. Eppstein. The crust and the beta-skeleton: Combinatorial curve reconstruction. Graphical Models and Image Processing, 60(2):125–135, 1998.

该类的优点是它提供了一种通用的方法来处理和分割点云表面,并且可以扩展到各种几何形状和应用中,这些类型的算法包括表面平滑、孔填充、点云上采样等。

pcl::MeshProcessing

pcl::MeshProcessing 类提供了许多处理三角网格的方法,包括简化、平滑、剖分等。它是一个非常实用的工具类,可以帮助用户轻松地处理三角网格数据。实现基于点云库和三角网格库,可以快速高效地处理大规模的三角网格数据。其主要功能包括:

  • 三角网格简化:提供了多种简化算法,可以将三角网格数据简化为指定的顶点数或误差范围内的网格。

  • 三角网格平滑:提供了多种平滑算法,可以平滑三角网格的顶点坐标和法向量。

  • 三角网格剖分:提供了多种剖分算法,可以将三角网格划分为更小的网格或子网格。

  • 三角网格重建:提供了多种重建算法,可以从点云数据中重建三角网格。

其中,pcl::MeshSimplification 类实现了多种三角网格简化算法,pcl::MeshSmoothing 类实现了多种三角网格平滑算法,pcl::MeshSubdivision 类实现了多种三角网格剖分算法。

pcl::PCLSurfaceBase

该是PCL中用于表面重建的抽象基类,提供了一些公共接口和虚函数,其子类可以通过实现这些接口和函数来实现不同的表面重建算法。本质上,pcl::PCLSurfaceBase是一种面向对象的设计模式,通过定义抽象类和虚函数,提供了一种规范化的接口,让子类可以自由地实现自己的算法而不需要考虑太多与上层框架的耦合关系。该类包含了一些重要的虚函数,例如reconstruct、process和initCompute等。多个子类继承了pcl::PCLSurfaceBase抽象类,并实现了不同的表面重建算法。

pcl::SurfaceReconstruction

主要包括了基于网格的重建和基于点云的重建两种方法。其中基于网格的方法包括了 Poisson 重建、Greedy Projection Triangulation (GPT)、Moving Least Squares (MLS) 等,而基于点云的方法则包括了 Marching Cubes、Poisson 等。在实现方面,SurfaceReconstruction 类提供了一些通用的接口,可以方便地进行点云表面重建。具体实现方法可以参考 PCL 库的官方文档。

pcl::MeshConstruction

该类是一个实现了多种三角网格构建算法的基类,它提供了一种从点云数据中构建三角网格模型的方法,可以实现高效、准确和平滑的三角网格构建。该类包含以下常用的子类:

  • pcl::GreedyProjectionTriangulation:基于贪婪投影三角测量(GPT)的三角网格构建算法。

  • pcl::OrganizedFastMesh:基于有序快速网格构建(OFM)算法的三角网格构建方法。

  • pcl::Poisson:基于Poisson重构方法的三角网格构建算法。

这些子类都可以实现从点云数据中构建三角网格模型。具体来说,pcl::GreedyProjectionTriangulation类实现了一种基于贪心策略的投影三角测量算法,它从点云数据中构建一个三角网格表面。该算法在每个点周围构建一组三角形,以生成平滑的表面。pcl::OrganizedFastMesh则是一种基于有序点云的快速网格构建算法,它利用了点云的有序性,从而减少了运算量。pcl::Poisson算法则是一种基于Poisson重构方法的三角网格构建算法,它通过重构梯度场来获得更加平滑的三角网格表面。

pcl::TextureMapping

该类是 PCL 库中用于纹理映射的模块,提供了多种纹理映射的算法,包括基于图像的纹理映射、基于投影的纹理映射和基于几何特征的纹理映射。实现方法:

  1. 基于图像的纹理映射:这种方法利用输入的图像对三角形网格进行纹理映射。首先对三角形网格进行投影,将每个三角形映射到 2D 平面上。然后,使用图像的纹理对每个三角形进行贴图,从而得到纹理映射的结果。

  2. 基于投影的纹理映射:这种方法将相机的投影矩阵与输入的图像一起使用,对三角形网格进行纹理映射。首先,对每个相机进行投影,然后使用相机的视角对每个像素进行颜色采样,并将颜色作为纹理赋给三角形网格。

  3. 基于几何特征的纹理映射:这种方法根据输入点云的几何特征对三角形网格进行纹理映射。对于每个三角形,将其相邻的点云特征与纹理映射进行匹配,从而获得三角形的纹理映射。

参考论文

1. PCL Texture Mapping, A. Aldoma and M. Vincze, 2012

2. Efficient and Flexible Sampling with Blue Noise Properties of Triangular Meshes, E. Heitz and D. Nowrouzezahrai, 2018

3. Geometry Images, L. J. Guibas and P. J. Ramadge, 2003

总结

PCL中的surface模块包含了许多可以用于点云表面重建、拟合和分割的算法和工具。这些算法和工具主要涉及到点云的平滑、降采样、法向量计算、曲率计算、边界提取、点云拟合、投影等方面。这些功能可以用于点云的预处理、后处理以及更高级别的应用,如三维重建、物体识别和场景分析等。在介绍完surface模块之后,我们将继续深入分析和介绍每个类函数的具体实现,以便更好地理解每个功能的原理和用法,并能够更灵活地运用PCL库进行点云处理和应用开发。

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

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

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

扫描二维码

                   关注我们

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

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多