点云数据结构化与体素化理论学习

一、PCD点云数据存储格式的进一步认识

(一)PCD点云存储格式相较于其它存储格式(如PLY、STL、OBJ、X3D等)的优势[1]

        (1)具有存储和处理有组织的点云数据集的能力,这对于实时应用和增强现实及机器人等研究领域十分重要;

        (2)二进制的mmap/munmap可能是最快加载和存储数据至磁盘的方式(在实验中,我发现Linux系统下基于PCL/Open3D库读取数据较Windows系统快。后经查阅了解到,二进制格式的点云数据读取是基于pcl::PointCloud.points array/vector的完全临时复制。在Linux系统中,为了尽可能最快地读取数据而采用mmap/munmap操作);

        (3)能够存储不同的数据类型(支持所有基础类型,如char、short、int、float和double)以达到高效处理和存储复杂的点云数据。无效的点云维度通常被存储为NAN类型,但自从PCL 1.0.1开始,NAN类型字符被替换为nan表示;

        (4)支持n-D直方图特征描述符,这对三维感知和计算机视觉应用十分重要;

        (5)通过控制文件格式,PCD存储格式可以最好地匹配PCL库,从而在PCL应用中获得最高的性能表现。与此同时,PCL应用运行不需要将各类数据格式都作为PCL的基础格式且不需要耗费额外的时间在数据转换函数上,以提高时空效率。

(二)PCD文件格式头解析[1]

        PCD文件的格式头用于识别和表明存储点云数据的确定属性,格式头必须为ASCII编码且每一个属性实体被换行符(\n)分隔。值得注意的是,视点位置较为重要,视点将会被用于不同坐标系统之间的转换或者辅助特征计算(如局部表面法线需要一个不变的视线辅助计算保持一致性,即法线定向[8])。

        (1)VERSION             PCD格式文件的版本号

        (2)FIELDS                 每一维度的特定属性标识名字

        (3)SIZE                      每一维数据存储的字节数(unsigned char/char为1字节;unsigned short/short为2字节;unsigned int/int/float为4字节;double为8字节)

        (4)TYPE                     每一维度表示字符的数据类型(I-int8(char)/int16(short)/int32(int) U- uint8(unsigned char)/uint16(unsigned short)/uint32(unsigned int) F-float)

        (5)COUNT                  一个维度的表示元素数量。默认不表示COUNT情况,其为1

        (6)WIDTH                    一行记录的点的数量

        (7)HEIGHT                (有/无组织存储标记)若无组织存储为1,否则为点云数据存储的行数

        (8)VIEWPOINT            点云数据的视点(tx ty tz qw qx qy qz)

        (9)POINTS                   存储点云的总体数量(与WIDTH*HEIGHT一致)

        (10)DATA                     特定数据格式存储的点云数据

图一 PCD存储格式文件图示

二、基于KDTree的点云结构化组织

        在计算机科学里,k-d树(k-dimensional tree)是在k维欧几里德空间组织点的数据结构,是空间二叉树的一种特殊情况。k-d树可以使用在多种应用场合,如多维键值搜索(如范围搜索及最邻近搜索)。k-d树是每个叶子节点都为k维点的二叉树,所有非叶子节点可以视作用一个超平面把空间分割成两个半空间。节点左边的子树代表在超平面左边的点,节点右边的子树代表在超平面右边的点。选择超平面的方法如下:每个节点都与k维中垂直于超平面的那一维有关[2]。

        一个三维树。第一次划分(红色)把根节点(白色)划分成两个节点,然后它们分别再次被划分(绿色)为两个子节点。最后这四个子节点的每一个都被划分(蓝色)为两个子节点。因为没有更进一步的划分,最后得到的八个节点称为叶子节点,如图二所示。

图二 三维k-d树图示(图源wikipedia)

三、点云数据的三维格网化/体素化

        体素(Voxel)是体积像素的简称。概念上类似二维空间的最小单位—像素,像素用于二维图像。体积像素一如其名,是数字资料于三维空间分割上的最小单位[4]。点云数据三维格网化通常用于基于体素的深度学习数据预处理、局部相对特征计算以及投影。

图三 体素示意图(图源wikipedia)

四、基于的Octree的点云结构化组织

        八叉树(Octree)是一种树形数据结构,每个内部节点都正好有八个子节点。八叉树常用于分割三维空间,将其递归细分为八个卦限。八叉树是四叉树在三维空间中的对应,在三维图形、三维游戏引擎等领域有很多应用。八叉树的每个节点都可以代表一个空间,对应的八个子节点则将这个空间细分为八个卦限。点域(point region,简称PR)八叉树的节点中都存储着一个三维点,即该节点对应区域的“中心”,也是八个子节点对应区域中的一个角落。矩阵(matrix based,简称MX)八叉树中,节点只记录区域范围,对应的中心点坐标需要从区域范围推算。因此,PR八叉树的根节点可以表示无限大的空间;而MX八叉树的根节点只能表示有限空间,这样才可以得到隐含的中心点[6]。

图四 八叉树递归划分图示(图源wikipedia)

参考资料:

[1] The PCD (Point Cloud Data) file format — Point Cloud Library 1.14.0-dev documentation

[2] https://en.wikipedia.org/wiki/K-d_tree

[3] KDTree - Open3D 0.18.0 documentation

[4] https://en.wikipedia.org/wiki/Voxel

[5] Voxelization - Open3D 0.18.0 documentation

[6] https://en.wikipedia.org/wiki/Octree

[7] Octree - Open3D 0.18.0 documentation

[8] Open3D 法线估计(2)——法线定向_open3d法向量定向-CSDN博客

[9] Open3D KDTree的使用_open3d使用kdtree-CSDN博客

[10] Open3D 从点云中构建八叉树_根据空间点构造八叉树-CSDN博客

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

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

相关文章

20240302-1-ZooKeeper面试题(三)

21. 集群最少要几台机器,集群规则是怎样的? 集群规则为 2N1 台,N>0,即 3 台。 22. 集群支持动态添加机器吗? 其实就是水平扩容了,Zookeeper 在这方面不太好。两种方式:第 62 页 共 485 页全部重启&a…

苍穹外卖学习 Day10 Day11 Day12

前言 用于记录苍穹外卖Day10、Day11、Day12的学习 Day10 订单状态定时处理 来电提醒 客户催单 订单状态定时处理 Spring Task Spring Task是一个任务调度工具,可以按照约定的时间自动执行某个代码逻辑(定时自动执行某段Java代码) cron表…

代码随想录算法训练营第三十天| 回溯篇总结

文章目录 前言一、组合问题二、切割问题三、子集问题四、排列问题五、性能分析总结 前言 回溯法就是暴力搜索,并不是什么高效的算法,最多再剪枝一下。 组合问题:N个数里面按一定规则找出k个数的集合 排列问题:N个数按一定规则全…

【黑马程序员】STL之set和map容器

文章目录 set/multiset容器set基本概念简介区别 set的构造和赋值功能描述函数原型代码示例运行结果 set的大小和交换功能描述函数原型代码示例运行结果 set的插入和删除功能描述函数原型代码示例运行结果 set查找和统计函数原型代码示例运行结果 set和multiset区别区别代码示例…

JVM(6)

JMM JVM定义了一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果.在此之前,C/C直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台下的内存模型差异,有可能导致程序在一套平台上并发完全正常,而在另…

深入解剖指针(4)

个人主页(找往期文章包括但不限于本期文章中不懂的知识点): 我要学编程(ಥ_ಥ)-CSDN博客 目录 回调函数 qsort使用举例 使用qsort函数排序整型数据 使用qsort排序结构数据 qsort函数的模拟实现 回调函数 回调函数就是一个通过函数指…

《Spring Security 简易速速上手小册》第10章 未来趋势与高级话题(2024 最新版)

文章目录 10.1 云原生安全性趋势10.1.1 基础知识10.1.2 重点案例:保护微服务通信10.1.3 拓展案例 1:容器安全最佳实践10.1.4 拓展案例 2:自动化安全审计和合规性检查 10.2 反应式编程与 Spring Security10.2.1 基础知识10.2.2 重点案例&#…

nginx-图片模块

./configure --with-http_image_filter_module location / {root html;index index.html index.htm;if ($arg_w "") {set $arg_w -;}if ($arg_h "") {set $arg_h -;}image_filter resize $arg_w $arg_h;image_filter_jpeg_quality 95; } 访问: 1234…

CSS锥形渐变:conic-gradient()

画一个扇形图&#xff0c;使用常规方法可能很难画&#xff0c;但是用锥形渐变的话非常好画 <style>.pattern{width: 100px; height: 100px;border-radius: 50%;background: conic-gradient(yellow 30deg , black 30deg , black 90deg , yellow 90deg ,yellow 150d…

Git分布式版本控制系统——git学习准备工作

一、Git仓库介绍 开发者可以通过Git仓库来存储和管理文件代码&#xff0c;Git仓库分为两种&#xff1a; 本地仓库&#xff1a;开发人员自己电脑上的Git仓库 远程仓库&#xff1a;远程服务器上的Git仓库 仓库之间的运转如下图&#xff1a; commit&#xff1a;提交&#xff…

Decoupled Knowledge Distillation解耦知识蒸馏

Decoupled Knowledge Distillation解耦知识蒸馏 现有的蒸馏方法主要是基于从中间层提取深层特征&#xff0c;而忽略了Logit蒸馏的重要性。为了给logit蒸馏研究提供一个新的视角&#xff0c;我们将经典的KD损失重新表述为两部分&#xff0c;即目标类知识蒸馏&#xff08;TCKD&a…

c++之旅——第四弹

大家好啊&#xff0c;这里是c之旅第三弹&#xff0c;跟随我的步伐来开始这一篇的学习吧&#xff01; 如果有知识性错误&#xff0c;欢迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 创作不易&#xff0c;希望大家多多支持哦&#xff01; 本篇文章的主…

如何对比 MySQL 主备数据的一致性?

随着业务范围的扩大&#xff0c;很多企业为了保障核心业务的高可用性&#xff0c;选择了 MySQL 主从架构&#xff0c;这一套方案通常具备主备数据同步、数据备份与恢复、读写分离、高可用切换等特性&#xff0c;是一种相当成熟可靠的数据库架构方案。然而这套方案在特定情况下可…

Redis小白入门教程

Redis入门教程 1. Redis入门1.1 Redis简介1.2 Redis服务启动与停止1.2.1 Redis下载1.2.2 服务启动命令1.2.3 客户端连接命令1.2.4 修改Redis配置文件 2. Redis数据类型2.1 五种常用数据类型介绍2.1.1 字符串操作命令2.1.2 哈希操作命令2.1.3 列表操作命令2.1.4 集合操作命令2.1…

双周回顾#006 - 这三个月

断更啦~~ 上次更新时间 2023/11/23, 断更近三个月的时间。 先狡辩下&#xff0c;因为忙、着实忙。因为忙&#xff0c;心安理得给断更找了个借口&#xff0c;批评下自己~~ 这三个月在做啥&#xff1f;跨部门援助&#xff0c;支援公司互联网的 ToC 项目&#xff0c;一言难尽。 …

【C语言】InfiniBand 驱动mlx4_ib_init和mlx4_ib_cleanup

一、中文讲解 这两个函数是Linux内核模块中对于Mellanox InfiniBand 驱动程序初始化和清理的函数。 mlx4_ib_init()函数是模块初始化函数&#xff0c;使用__init宏标注&#xff0c;表示该函数只在模块加载时运行一次。 函数执行的步骤如下&#xff1a; 1. 通过alloc_ordered_w…

数据结构——lesson5栈和队列详解

hellohello~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;数据结构学习笔记 &#x1f4a5;对于顺序表链表有疑问的都可以在上面数据结构的专栏进行学习哦~感谢大家的观看与…

ElasticSearch开篇

1.ElasticSearch简介 1.1 ElasticSearch&#xff08;简称ES&#xff09; Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。能够达到实时搜索&#xff0c;稳定&#xff0c;可靠&#xff0c;快速&#xff0c;安装使用方便。 1.2 ElasticSearch与Lucene的关…

模拟器抓HTTP/S的包时如何绕过单向证书校验(XP框架)

模拟器抓HTTP/S的包时如何绕过单向证书校验&#xff08;XP框架&#xff09; 逍遥模拟器无法激活XP框架来绕过单向的证书校验&#xff0c;如下图&#xff1a; ​​ 解决办法&#xff1a; 安装JustMePlush.apk安装Just Trust Me.apk安装RE管理器.apk安装Xposedinstaller_逍遥64位…

智能边缘小站 CloudPond(低延迟、高带宽和更好的数据隐私保护)

智能边缘小站 CloudPond(低延迟、高带宽和更好的数据隐私保护) 边缘小站的主要功能是管理用户在线下部署的整机柜设施&#xff0c;一个边缘小站关联一个华为云指定的区域和一个用户指定的场地&#xff0c;相关的资源运行状况监控等。 边缘计算 迈入5G和AI时代&#xff0c;新…