学习PCL库:PCL库中的geometry模块介绍

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

geometry模块介绍

PCL库中的geometry模块主要提供了点云几何计算的工具,geometry模块提供了点云和三维网格(mesh)处理的一些基本算法和数据结构。

学习PCL库:PCL库中filters模块

学习PCL库:PCL库中surface模块

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

学习PCL库需要知道哪些知识?

学习PCL库:基于LOD的大规模点云可视化

学习PCL库你应该知道的C++特性

学习PCL库:PCL库中的IO模块介绍

主要内容

pcl::LineIterator

用于在3D点云中沿直线迭代遍历点,它的原理是根据输入的起点和终点,计算出沿直线的总距离,并将该距离分为多个步长,在每个步长中,通过线性插值计算出当前迭代位置的坐标,并在点云中查找最近的点。该类的实现方法使用了线性插值、最近邻搜索等算法。主要成员函数包括:

  • pcl::LineIterator(const PointT &start, const PointT &end, double distance = 0.005):构造函数,输入起点和终点坐标以及迭代的步长距离。

  • bool isValid() const:判断当前迭代位置是否合法。

  • const PointT& operator*() const:返回当前迭代位置的3D坐标。

  • LineIterator& operator++():将迭代器推进到下一个位置。

其中,isValid()函数用于判断当前迭代位置是否越界,operator*()函数用于返回当前迭代位置的点云坐标,operator++()函数用于将迭代器推进到下一个位置。

pcl::geometry::MeshBase

用于表示三维网格模型的基础类,该类是一个抽象类,提供了访问和操作三角形网格模型的接口,如获取点云、三角形面片、法线等。pcl::geometry::MeshBase类的数据结构是基于半边结构的(Half-Edge Structure),该数据结构用于描述三角形网格的拓扑关系,包括点、边和面的关系,使得对网格模型的操作更加高效。其中,半边(Half-Edge)是一个有向的边,从一个顶点指向相邻的另一个顶点,并指向下一条半边,组成了一个环(Loop)。在pcl::geometry::MeshBase中,使用Vertex表示网格模型中的顶点,其中包含了三维坐标信息和一些额外的属性;使用HalfEdge表示网格模型中的半边,其中包含了顶点索引、边的索引和相邻的下一条半边的索引;使用Face表示网格模型中的三角形面片,其中包含了三个半边的索引和面片法向量。该类提供了一系列用于访问和操作三角形网格模型的接口函数,包括:

* getPointCloud():获取网格模型的点云数据;

* getTriangles():获取网格模型的三角形面片数据;

* computeBoundingBox():计算网格模型的边界框;

* computeNormals():计算网格模型的法线;

* triangulate():对网格模型进行三角剖分;

* mergeVertices():合并重复的顶点;

* removeVertices():删除指定的顶点;

* removeFaces():删除指定的面片;

* removeDegenerateFaces():删除包含重复顶点或长度为0的边的面片。

此外,pcl::geometry::MeshBase还提供了一些用于获取和设置网格模型数据结构的接口函数,如获取点、半边和面的数量,获取指定索引的点、半边和面,以及添加新的点、半边和面等。

pcl::geometry::VertexAroundVertexCirculator

pcl::geometry::VertexAroundVertexCirculator 实现点云网格处理的重要类之一,用于迭代遍历给定点的所有相邻点。该类的实现基于半边数据结构 (Half-Edge Data Structure) ,半边数据结构是一种用于表示三维多面体和网格的数据结构。通过构建这种数据结构,可以轻松访问点、边、面以及相邻的实体,并对它们进行操作。半边数据结构中的每条半边都存储了以下信息:

  •  该半边的起始点

  •  该半边所在的面

  •  该半边的下一条半边

  •  该半边的对称半边

pcl::geometry::VertexAroundVertexCirculator 封装了半边数据结构的迭代器,以实现点云网格处理的相关操作。通过使用 pcl::geometry::VertexAroundVertexCirculator 迭代器,可以轻松遍历给定点的所有相邻点,实现点云网格处理中的相关操作,例如法向量计算和邻域点云特征提取。

pcl::geometry::OutgoingHalfEdgeAroundVertexCirculator

它提供了一种迭代器的方式,用于遍历以一个顶点为起点的所有半边,该类是建立在 pcl::geometry::HalfEdgeMesh 类的基础之上的,HalfEdgeMesh 是一种非常常见的数据结构,用于表示三维网格模型。在 HalfEdgeMesh 中,一个三角形面片被划分为三个半边,每个半边包含了指向相邻三角形的指针,这种结构可以有效地描述网格模型的拓扑结构。这个类有一个构造函数和一个析构函数,主要的操作是 operator++() 和 operator*(),它们用于遍历以某个顶点为起点的所有半边。其中 operator++() 实现了顺时针遍历顶点周围的所有半边,并返回遍历后的当前半边。而 operator*() 则返回当前半边的指针。通过这两个操作,可以方便地获取以一个顶点为起点的所有半边。

pcl::geometry::IncomingHalfEdgeAroundVertexCirculator 

该类是 PCL 库中用于迭代遍历以给定顶点为起点的所有入边的迭代器类。它是基于半边数据结构(Half-Edge Data Structure)实现的。该迭代器类将当前顶点作为输入参数,并提供一个可以返回下一个入边的方法,直到回到起点为止。算法可以参考以下论文:

* G. Taubin, "A Signal Processing Approach to Fair Surface Design", Proceedings of ACM SIGGRAPH, pp. 351-358, 1995.

pcl::geometry::FaceAroundVertexCirculator

该类是 PCL 中用于遍历点对应的面的类。该类继承自 pcl::geometry::CirculatorBase,提供了访问点周围面的方法。该类主要通过构造函数和前缀自增运算符实现对点周围面的遍历。在构造函数中,首先获取与该点相邻的一个半边,然后通过该半边获取对应的面。在遍历时,只需沿着下一个半边继续遍历,并获取对应的面即可。该类中还重载了访问运算符 operator-> 和 operator*,使用户能够访问到当前遍历到的面。

pcl::geometry::VertexAroundFaceCirculator 

pcl::geometry::VertexAroundFaceCirculator 是PCL库中的一个类,用于在半边数据结构(Half-Edge Data Structure)中遍历以一个顶点为起点的所有三角形面片。该类通过存储一个起始面片和当前面片的指针来实现遍历一个顶点相邻的所有面片。在遍历过程中,它通过查询当前面片的相邻面片和相邻顶点的方法,从而访问到顶点相邻的所有面片。

class  pcl::geometry::InnerHalfEdgeAroundFaceCirculator

pcl::geometry::InnerHalfEdgeAroundFaceCirculator 是 PCL 库中用于表示三角网格中某个面周围的半边的类,其实现方法基于迭代器模式,可以用于遍历与面相邻的所有三角形。在 PCL 中,该类主要被用于遍历三角网格的拓扑结构,如寻找某个顶点的所有相邻顶点、某个面周围的所有三角形等。

class  pcl::geometry::OuterHalfEdgeAroundFaceCirculator

该是PCL库中用于遍历一个mesh面(facet)外环上的所有半边(he)的类。该类继承自pcl::geometry::HalfEdgeCirculator,并增加了面的处理和相关遍历方法。在3D mesh中,每个面(facet)由多个三角形构成,每个三角形边界上都有一条半边,通过半边可以遍历到相邻的三角形,从而完成面的遍历。而面的外环是所有边上法向量指向该面法向量的边的集合,通过遍历外环上的所有半边,可以获取该面的所有边界上的半边信息。

class  pcl::geometry::FaceAroundFaceCirculator

用于遍历三角网格面的迭代器,可以方便地访问和处理三角网格面。FaceAroundFaceCirculator主要用于遍历三角网格中与当前面相邻的面,可以方便地进行一些面相关的处理操作,例如计算法向量、计算面积等。同时,它也可以与其他迭代器(例如VertexAroundFaceCirculator)配合使用,方便地遍历三角网格中的各个部分,进行复杂的数据处理。

pcl::geometry::MeshIO

用于读取和写入三维网格模型文件的类。该类的实现位于 pcl/geometry/mesh_io.h 中。

pcl::geometry::MeshIO 提供了从常见的三维网格模型文件格式(如PLY、OBJ等)中读取和写入三维网格模型的方法。该类的实现使用了第三方库(如Assimp、VTK等)来解析和生成网格模型,提供了简单易用的接口,方便用户读写三维网格模型。pcl::geometry::MeshIO 中包含了一系列的静态方法,如 loadPLYFile()、savePLYFile() 等,用于从文件中读取和写入三维网格模型。这些方法在实现时,会调用第三方库的接口来解析和生成三维网格模型。在读取和写入过程中,还提供了一些选项,如是否加载法向量、颜色等,以及文件的编码格式、二进制或ASCII等。

struct  pcl::geometry::DefaultMeshTraits

是 PCL 中的一个结构体,用于定义默认的三角网格类型。它定义了三角网格中顶点和面的数据结构。主要用于为 pcl::geometry::PolygonMesh 类型提供默认的顶点和面属性,以及相应的操作方法。PolygonMesh 是 PCL 中的一个数据类型,表示一个三角网格,包含了顶点、面和半边等信息。DefaultMeshTraits 的实现方法相对简单,只需要定义好每个成员变量的数据类型,并提供相应的 get() 和 set() 方法即可。

class  pcl::OrganizedIndexIterator

用于实现在有序点云数据中对于点的迭代遍历。在有序点云中,点云数据是以二维矩阵的形式存储的,而非无序点云中的任意顺序。因此,这种点云数据结构能够提供更高效的遍历方式和数据处理方法,尤其适用于立体视觉、激光雷达等应用中。该类的实现方法是通过计算出点的索引,并且实现从第一个点开始遍历所有点。使用该类需要提供点云数据的长和宽。在遍历过程中,可以使用 operator++() 进行点的迭代遍历,而使用 operator*() 获取当前索引处的点数据。

class  pcl::geometry::PolygonMesh

用于表示多边形网格的类,它包含了多个多边形(即面)以及它们的顶点和边。在 PolygonMesh 中,每个面由它的顶点和它们之间的边构成,同时每个顶点也有对应的边和面。这种数据结构常用于表示三维模型,可以用于各种三维计算,例如表面重建、点云拼接等。

  • PolygonMesh 中的数据结构是一个有向图,每个节点表示一个面、一个顶点或一条边。它由三个数组组成:

  • cloud:一个点云,其中每个点对应一个顶点。

  • polygons:一个向量,其中每个元素表示一个多边形,其中的每个索引都是 cloud 中的点的索引。

  • header:一个 std::string,用于存储额外的信息。

PolygonMesh 的实现是基于模板类 pcl::geometry::MeshBase,它提供了许多操作多边形网格所需的方法,例如添加/删除顶点和面、访问边和半边数据结构等。同时,它也提供了一个通用的数据结构,可以与不同的多边形表示方法一起使用。

class  pcl::geometry::QuadMesh

用于存储和操作四边形面片网格数据,该类提供了一些有用的方法,如计算网格的表面积、法向量、重心、边界框等,以及可以在网格中添加和删除顶点、面片和边缘的方法。

class  pcl::geometry::TriangleMesh

用于表示三角网格(Triangle Mesh)的类。在三维计算机图形学中,三角网格是由许多相互连接的三角形组成的多边形网格。三角网格被广泛用于表示复杂的几何形状,如人体器官、建筑物等,也常被用于三维建模、渲染和动画等应用中。

pcl::geometry::TriangleMesh 类是 pcl::geometry::MeshBase 的子类,继承了 MeshBase 的所有接口。它通过存储三角形的顶点索引来表示三角网格。可以使用以下代码创建一个 TriangleMesh 对象:

pcl::geometry::TriangleMesh mesh;

可以通过以下代码向 TriangleMesh 对象中添加顶点和三角形:

pcl::Vertices vertices;
pcl::PointXYZ pt1(0, 0, 0), pt2(1, 0, 0), pt3(0, 1, 0);
mesh.addVertex(pt1);
mesh.addVertex(pt2);
mesh.addVertex(pt3);
vertices.vertices.push_back(0);
vertices.vertices.push_back(1);
vertices.vertices.push_back(2);
mesh.addPolygon(vertices);

其中,addVertex() 函数用于向三角网格中添加一个顶点,addPolygon() 函数用于向三角网格中添加一个三角形。pcl::Vertices 对象用于存储三角形的顶点索引。

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

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

扫描二维码

                   关注我们

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

分享与合作方式:微信“cloudpoint9527”(备注:姓名+学校/公司+研究方向) 联系邮箱:dianyunpcl@163.com。

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

db6bd6ea44a15ffeb0ce3ac7301180a3.gif