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

news2024/11/26 11:59:58

公众号致力于点云处理,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【万字更新】Python基础教程:第六章_数据容器

原创:公众号 数据说话 【万字更新】Python基础教程:第六章_数据容器 为什么学习数据容器 思考一个问题:如果我想要在程序中,记录5名学生的信息,如姓名。 最好的方法是不是简单的定义5个字符串变量就可以了 name1&…

基于AT89C51单片机的计算器设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87772564 源码获取 主要内容: 本设计是基于51系列的单片机进行的设计,可以完成计算器的键盘输入,进行加、减、3位无符号数字的简单运算,并在LED上相应的显示结果。设计过…

TOB企业如何借助生态力,实现可持续增长

近年来,随着经济社会的高速发展,数字化转型已成为企业高质量发展“必答题”。企业开始通过购买产品、解决方案或者自研的方式来进行本企业的数字化建设。但是由于内部部门墙或者是系统之间的隔阂,难以做到以整个公司为视角的全面数字化建设&a…

数据库专题:数据库初学者的数据一致性

在这篇文章中,我将分享我在数据库学习课程中学到的知识,了解到目前为止让我着迷的数据库主题。 ​1:序言 在 2022 年底,当主题是数据库时,我决定把事情弄清楚,因为这总是一种痛苦,作为后端开发…

虚拟汽车加油问题——算法设计与分析(C实现)

目录 一、问题描述 二、问题剖析 三、代码实现 四、结果验证 一、问题描述 问题描述:一辆虚拟汽车加满油后可行驶n km。旅途中有若干加油站。设计一个有效算法,指出应该在那些加油站停靠加油,使沿途加油次数最少。并证明算法的能产生一个…

安卓Webview网页秒开策略探索

1 人赞同了该文章 痛点是什么? 网页加载缓慢,白屏,使用卡顿。 为何有这种问题? 1.调用loadUrl()方法的时候,才会开始网页加载流程 2.js臃肿问题 3.加载图片太多 4.webview本身问题 webiew是怎么加载网页的呢&…

品优购项目学习记录--01公共模块制作

文章目录 一、品优购项目规划1.1 开发工具以及技术栈1.1.1 开发工具1.1.2 技术栈 1.2 品优购项目搭建工作1.2.1 相关文件夹以及文件创建1.2.2 模块化开发1.2.3 网站favicon图标1.2.4 网站TDK三大标签SEO优化 二、品优购首页制作2.1 常用模块类名命名2.2 快捷导航shortcut制作2.…

传统的二次开发有哪些痛点问题?低代码平台帮你解决

一、什么是二次开发呢? 简单的来讲,二次开发就是在原有得软件中进行功能等方面得修改或者扩展,但是不改变原有系统的内核。 二、传统的二次开发有哪些痛点问题? 很多企业在业务发展的过程中会产生各种各样不同得需求&#xff0…

融云亮相「中国信息技术应用创新大会」,入选数字化转型优秀方案集

4 月 27 日,以“全栈创新 从可用到好用”为主题的“2023 第六届中国信息技术应用创新大会”在京顺利召开。移步【融云全球互联网通信云】回复“地图”限量免费领《社交泛娱乐出海作战地图》 大会以“论坛展示展览”的方式,全面、深入地反映信创产业的最新…

基于Android studio的机票管理app设计与开发案例

一 功能介绍 1. 用户模式功能: 用户注册登录功能(账号、密码);航班信息(航班号、起飞时间、登机时间、起点、终点、登机口);购买机票机票信息(航班号、审核状态、乘客姓名、联系方…

Windows平台Qt超详细安装——5.9.6版本以及5.9都差不多,(仔细看,一定学会,学不会怪我)

目录 一、Qt 开发环境(Windows) 二、设置 QtCreator 编译路径 三、设置 Qt 源码路径 四、QtCreator 介绍 一、Qt 开发环境(Windows) ①官网下载地址:(对应版本,可以在这个网址下面自己找&a…

字节给的比我想的还多?网友看完:打死也要去

曾经的互联网是PC的时代,随着智能手机的普及,移动互联网开始飞速崛起。而字节跳动抓住了这波机遇,2015年,字节跳动全面加码短视频,从那以后,抖音成为了字节跳动用户、收入和估值的最大增长引擎。 自从字节…

【2023考研】双非末流二本非科班一战上岸杭电经验帖

一、作者背景 我本科就读于黑龙江省某末流二本双非大学的物联网工程专业,专业排名一般就在20%左右,在校期间无科班竞赛经验,只参加过大学生数学竞赛和杭电要求的PAT考核乙级,项目方面只参加过大创比赛以及专业的课程设…

短视频矩阵多账号系统应用技术开发.源码

抖音矩阵号管理系统是一款用于管理抖音矩阵号的软件,具有如下特点: 1. 用户管理:支持多用户管理,可以指定每个用户对应的抖音矩阵号。 2. 粉丝管理:支持实时查看粉丝数量、关注者数量、点赞数量等统计数据&#xff0c…

学系统集成项目管理工程师(中项)系列20_变更管理

1. 许多项目失败的原因就是由于对变更的处理不当 2. 变更管理是为了使项目实际执行情况和项目基准相一致而对项目变更进行管理,其可能的结果是拒绝变更或调整基准 3. 分类 3.1. 性质 3.1.1. 重大变更 3.1.2. 重要变更 3.1.3. 一般变更 3.1.4. 通过不同审批权…

【Linux】Linux权限,shell命令以及运行原理

之前我们一直敲得命令和口口声声说的shell到底是什么呢?命令行提示符和输入的指令并且可以执行都是通过命令行解释器来实现的,那么命令行解释器就是我们常说的shell,具体我们看下面! 目录 一、shell命令以及运行原理 二、Linux权…

百亿量化私募高薪急招C++

百亿量化私募高薪急招C! 秋招/校招/社招,21/22/23届可 base北上杭深 现招岗位:C量化系统开发工程师 年base40-80万bonus 通过这里找到我 slam_pan 工作职责 1. 参与交易平台的设计、开发与测试,实现交易策略、风控等需求; 2. 开发…

【DahO安装及使用】

1 安装 Step 1:官网注册帐号 注册地址在这里(注册完毕默认登录) Step 2:点击下载链接,下载你需要的版本 这里,我下载的是DashO的Windows版本。 下载完毕后官方会向您发送邮件,复制其中的&qu…

WMS和ERP的区别是什么

WMS和ERP是企业常用的两种管理软件,虽然它们都是管理企业资源的软件,但它们的功能和使用场景有所不同。 那么问题来了:很多工厂的管理者都知道自己已经购买或者计划购买的ERP中包含仓储管理模块,那么WMS和ERP系统中的仓储管理模…

node:常用的文件操作fs模块

文章目录 背景读写创建复制移动(重命名)是否存在删除示例1、文件内容替换2、文件夹内的所有文件内容替换 封装 背景 我们日常工作中,想要对前端做一些自动化操作的时候,免不了使用 node 的文件读写操作,今天来总结一下…