三维数据学习笔记:ply数据内容介绍

目录

  • 前言
  • 1. 三维数据的组成
    • 1.1 点云数据
    • 1.2 网格数据
  • 2. ply数据内容
    • 2.1 属性
      • 2.1.1 文本描述属性
      • 2.1.2 数据描述属性
        • 2.1.2.1 顶点(vertex)
        • 2.1.2.2 面(face)
        • 2.1.2.3 相机(camera)
    • 2.2 数据
      • 2.2.1 顶点(vertex)
      • 2.2.2 面(face)
      • 2.2.3 相机(camera)
  • 3. 示例
    • 3.1 示例1
    • 3.2 示例2


前言

最近根据公司的调整开始转向三维重建和三维检测方向。对于三维方向而言,首先应该认识三维数据的存储形式。三维数据的形式多种多样,截止到现在我已经看到了ply格式数据、obj格式数据、pcd格式数据、osgb格式数据、b3dm格式数据等等。相比于二维图像,三维数据的形式更多且复杂。因此,我打算整理出常用的三维数据存储格式总结文章。本篇以ply格式数据作为开篇。

本篇文章简单介绍ply的基础属性,可能有部分的属性没有涉及到,望读者朋友见谅!


参考博客:
1.作者:飞天牛牛, 学习 点云格式(PLY)


1. 三维数据的组成

相比于二维图像是用像素点构成,三维数据则是由顶点和面构成。在ply格式数据中,既可以包含顶点数据,也可以包含面数据。但是顶点数据是必须存在的。

1.1 点云数据

当数据中只存在顶点数据,没有面数据时,一般称为点云数据。这些顶点数据是由vector<x, y, z>表示。点云数据的显示如下图:
在这里插入图片描述
通过Notepad++(或者其他文本查看软件),可以看到ply里面的内容,都是由点构成,如下图所示:
在这里插入图片描述

1.2 网格数据

当数据中有面属性时,一般称为网格数据(mesh)。网格数据在我的理解中就是由许多面片(多边形)构成的数据,面片可以是三角面片,四边形面片等,但是常用的是三角面片构成的网格数据。

有面属性的数据,肯定会有点云数据,因为面是由点构成的。

网格数据展示如下图所示:
在这里插入图片描述
如果有纹理图映射的话,效果如下:在这里插入图片描述
通过Notepad++(或者其他文本查看软件),可以看到ply里面的内容,可以看到文本中既有点云数据,也有面数据。如下图所示:
在这里插入图片描述在这里插入图片描述

此示例可以明显看到三角面片构成的物体。在这里插入图片描述

2. ply数据内容

ply格式数据是通过文本进行描述的。因此,可以通过Notepad++等文本编辑软件进行打开查看。内容如下图所示:
在这里插入图片描述
从上图中可以看出,ply格式数据主要可以分为两个部分,分别是属性和数据。为了方便后续的介绍,我这里先列出一个ply格式框架。如下所示:

属性
   |----文本描述属性 (ply, format, comment 等等)
   |----数据描述属性
   |      |----element1:元素声明
   |      |----property1:元素数据组成声明
   |      |----element2:元素声明
   |      |----property2:元素数据组成声明
   |      |---- …
   |—文本描述属性(end_header)
数据
   |----element1对应的数据,以property1的声明方式存储。
   |----element2对应的数据,以property2的声明方式存储。
   |---- …

在这里插入图片描述

2.1 属性

属性部分主要是由文本描述属性和数据描述属性组成,其中数据描述属性包含vertex(顶点),face(面),camera(相机参数)等元素,文本描述属性则是描述文件的存储格式、存储来源以及文本注释。

2.1.1 文本描述属性

本节通过图片示例来进行介绍,图片示例如下:
在这里插入图片描述

第一行,用来表示这是ply数据。

ply

第二行,用来描述数据的存储形式,一般为两种分别是ascii存储和binary_little_endian存储。图片示例中表示是ascii存储。

format ascii 1.0

  • 其他情况: binary_little_endian存储(字节流存储)
    format binary_little_endian 1.0

第三行,用来描述该ply数据是由什么软件或者库生成的。图片示例中表示是由PCL库生成的。
"comment"为关键字,表示注释,用来声明后面为注释内容。因此,读者可以通过comment自行添加注释内容

comment PCL generated

  • 其他情况:
    comment VCGLIB generated

最后一行,表示文本描述属性结束,是文本描述属性和数据描述属性的分隔符。

end_header

补充:如果包含纹理映射的话,还会有纹理图描述属性。如下图所示:
这个应该是固定格式,读者朋友自己修改后面的图片名就好。
在这里插入图片描述以其中一行为例,内容如下。在示例中纹理图属性以空格为分隔符,将一行内容分隔为三个部分。第一个"comment"表示注释的关键字,"TextureFile"表示这是纹理图属性,"Tile_+082_+121_L22_00001100_0.jpg"则是纹理图的名称。

comment TextureFile Tile_+082_+121_L22_00001100_0.jpg

2.1.2 数据描述属性

数据描述属性由很多元素组成,其中每个元素都由element(元素声明)和property(元素数据组成声明)构成。element描述了该元素的名称及数量,property描述了元素数据的存储形式,数据类型以及数据名称。

同样以图片示例来介绍,图片示例如下:
在这里插入图片描述

2.1.2.1 顶点(vertex)

在图片示例中,从第四行到第十一行描述的是顶点元素

element vertex 3544221
property float x
property float y
property float z
property float nx
property float ny
property float nz
property float curvature

其中,第四行,"element"是关键字,"vertex"表示这是顶点元素, "3544221"表示顶点的数量。

element vertex 3544221

第五行,用来描述顶点元素中的x坐标,其中"property"是关键字, "float"表示数据类型,"x"表示数据名称。

property float x

第六行,用来描述顶点元素中的y坐标,其中"property"是关键字,"float"表示数据类型,"y"表示数据名称。

property float y

第七行,用来描述顶点元素中的z坐标,其中"property"是关键字, "float"表示数据类型,"z"表示数据名称。

property float z

第八行,用来描述顶点元素中法向量的x坐标,其中"property"是关键字, "float"表示数据类型,"nx"表示数据名称。

property float nx

第九行,用来描述顶点元素中法向量的y坐标,其中"property"是关键字, "float"表示数据类型,"ny"表示数据名称。

property float ny

第十行,用来描述顶点元素中法向量的z坐标,其中"property"是关键字, "float"表示数据类型,"nz"表示数据名称。

property float nz

第十一行,用来描述顶点元素中曲率,其中"property"是关键字, "float"表示数据类型,"curvature"表示数据名称。

property float curvature

除此之外,还有颜色的property,分别是RGB。如下面示例所示:
在这里插入图片描述
其中,对于property uint8 blue而言,"property"是关键字,"uint8"表示为uint8类型,"blue"为数据名称。该property是用来描述顶点的蓝色通道数据。

对于property uint8 green而言,"property"是关键字,"uint8"表示为uint8类型,"green"为数据名称。该property是用来描述顶点的绿色通道数据。

对于property uint8 red而言,"property"是关键字,"uint8"表示为uint8类型,"red"为数据名称。该property是用来描述顶点的红色通道数据。

2.1.2.2 面(face)

在图片示例中,从第十二行到第十三行描述的是面元素

element face 6607259
property list uchar int vertex_indices

其中,第十二行,"element"是关键字,"face"表示这是面元素, "6607259"表示面的数量。

element face 6607259

第十三行,用来描述面元素中的各个顶点的索引,其中"property"是关键字,"list"表示使用list类型存储数据,"uchar"表示list中的数据个数,类型为uchar类型,"int"表示list中数据为int类型,"vertex_indices"为数据名称。

property list uchar int vertex_indices

如果有纹理图映射的话,还有两个元素,分别是"texcoord"和"texnumber"。如下面示例所示:
在这里插入图片描述
其中,对于property list uchar float texcoord而言,"property"是关键字, "list"表示使用list类型存储数据,"uchar"表示list中的数据个数,类型为uchar类型,"float"表示list中数据为float类型,"texcoord"为数据名称。"texcoord"表示为顶点数据到二维纹理图上的坐标(归一化后)。

对于property int texnumber而言,"property"是关键字,"int"表示数据为int类型,"texnumber"为数据名称。"texnumber"表示为每个面片对应的是哪一张纹理图。

2.1.2.3 相机(camera)

这个我不太理解,可以附上例子方便读者参考。相机属性如下图所示:
在这里插入图片描述

2.2 数据

在属性之后,就是数据部分。数据部分有两种存储形式,分别是ASCII存储形式和binary存储形式,具体展示如下图所示。为了方便介绍,本篇文章将以ASCII存储形式为例子。数据部分的内容分别对应上节的数据描述属性中不同元素的内容。下面,我将分别介绍
在这里插入图片描述

2.2.1 顶点(vertex)

在数据描述属性中,顶点元素的内容如下:

element vertex 3544221
property float x
property float y
property float z
property float nx
property float ny
property float nz
property float curvature

其对应的数据存储形式为:

27498 5145 1.7902 -0.050252 -0.90111 -0.43067 0.057233
27499 5144.9 1.3479 -0.038979 -0.80628 -0.59026 0.071784

以第一行"27498 5145 1.7902 -0.050252 -0.90111 -0.43067 0.057233"为例,可以看到数据之间使用空格进行分开,并以property声明的数据顺序分别排序,即以x y z nx ny nz curvature的顺序从左往右排序。

  • x=27498,表示顶点x轴坐标,数据类型为float。
  • y=5145,表示顶点y轴坐标,数据类型为float。
  • z=1.7902,表示顶点z轴坐标,数据类型为float。
  • nx=-0.050252,表示法向量x轴坐标,数据类型为float。
  • ny=-0.90111,表示法向量y轴坐标,数据类型为float。
  • nz=-0.43067,表示法向量z轴坐标,数据类型为float。
  • curvature=0.057233,表示该顶点的曲率,数据类型为float。

这样一行就表示一个顶点数据,该数据数量根据描述属性有3544221个。

如果是带有RGB颜色的数据,还是同样的道理,此处不作过多赘述。如下图所示:
在这里插入图片描述

2.2.2 面(face)

在数据描述属性中,面元素的内容如下:

element face 10501193
property list uchar int vertex_indices

其对应的数据存储形式为:

3 154643 190669 190652
3 154656 154643 190669

以第一行"3 154643 190669 190652"为例,可以看到,数据之间使用空格进行分开,以列表的方式进行依次存储,存储的类型为uchar int int int。

  • "3"表示后面为包含3个点的列表,列表中分别对应三角面片的三个顶点索引,数据类型为uchar。
  • "154643"表示第一个顶点索引,即在之前的顶点数据中的第154643个顶点,数据类型为int。
  • "190669"表示第二个顶点索引,即在之前的顶点数据中的第190669个顶点,数据类型为int。
  • "190652"表示第三个顶点索引,即在之前的顶点数据中的第190652个顶点,数据类型为int。

这样的一行就表示一个面,该数据数量根据描述属性有10501193个。

如果还有纹理图映射的话,还有两个property,分别是:

element face 10501193
property list uchar int vertex_indices
property list uchar float texcoord
property int texnumber

其对应的数据存储形式为:

3 154643 190669 190652 6 0.021484 0.958008 0.029297 0.999023 0.001953 0.958008 0

  • 前4个数据同上面介绍,不过多赘述。
  • "6"表示后面有包含六个点的list,列表中分别对应三个顶点在纹理图上的映射坐标。数据类型为uchar。
  • "0.021484"表示第一个顶点在纹理图上x轴的归一化后坐标,数据类型为float。
  • "0.958008"表示第一个顶点在纹理图上y轴的归一化后坐标,数据类型为float。
  • "0.029297"表示第二个顶点在纹理图上x轴的归一化后坐标,数据类型为float。
  • "0.999023"表示第二个顶点在纹理图上y轴的归一化后坐标,数据类型为float。
  • "0.001953"表示第三个顶点在纹理图上x轴的归一化后坐标,数据类型为float。
  • "0.958008"表示第三个顶点在纹理图上y轴的归一化后坐标,数据类型为float。
  • “0” 表示该顶点在第1张纹理图上,纹理图的顺序在文本描述属性中已经列出,数据类型为int。

这样的一行就表示一个三角面片的纹理贴图

2.2.3 相机(camera)

我通过PCL库在保存法向量计算后的结果中,发现了如下元素。该是元素应该是PCL库保存数据后自动添加的。对于相机元素,我还不是很懂。因此,此处仅仅列出结果,如果后续有涉及,我会重新编辑此处内容。

数据描述属性:
在这里插入图片描述
其对应的数据存储形式为:
在这里插入图片描述

3. 示例

3.1 示例1

第一个示例是不包含纹理图映射的,四边形面片组成的立方体网格数据。

该示例引用博客学习 点云格式(PLY)。

示例内容如下(使用时请把注释内容删掉):

ply                                    # 文本描述属性:开头
format ascii 1.0                       # ascii存储形式
comment made by Greg Turk              # 注释:由Greg Turk创建
comment this file is a cube            # 注释:这是一个立方体
element vertex 8                       # element:顶点8个        
property float x                       # property:x
property float y                       # property:y
property float z                       # property:z
element face 6                         # element:面6个     
property list uchar int vertex_index   # property:vertex_index
end_header                             # 文本描述属性:结尾
0 0 0                                  # 第一个点坐标(0,0,0)              
0 0 1
0 1 1
0 1 0
1 0 0
1 0 1
1 1 1
1 1 0
4 0 1 2 3                              # 第一个四边形面片               
4 7 6 5 4
4 0 4 5 1
4 1 5 6 2
4 2 6 7 3
4 3 7 4 0

可视化展示如下:
在这里插入图片描述

3.2 示例2

第二个示例是包含纹理映射的,三角面片构成的方锥。示例如下:

注意:

  1. 纹理图要和ply数据放在同一目录下。
  2. 纹理图的坐标原点下在右下角,其中横轴为x,纵轴为y。
ply                                    
format ascii 1.0                       
comment made by Greg Turk             
comment this file is a cube 
comment TextureFile 1.png           
element vertex 5                             
property float x                       
property float y                       
property float z                      
element face 4                         
property list uchar int vertex_index 
property list uchar float texcoord
property int texnumber  
end_header                             
0 0 0                                            
0 1 0
1 0 0
1 1 0
0.5 0.5 1
3 0 1 4 6 1 0 0 0 0.5 1 0
3 2 0 4 6 1 0 0 0 0.5 1 0
3 1 3 4 6 1 0 0 0 0.5 1 0
3 3 2 4 6 1 0 0 0 0.5 1 0

可视化展示:
在这里插入图片描述
存放展示:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java基础(十七)File类与IO流

1. java.io.File类的使用 1.1 概述 File类及本章下的各种流&#xff0c;都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xff09;File 能新…

JDK17新特性之--JDK9到JDK17 String 新增的新方法

JDK9之后对String底层存储数据结构进行了重大的修改1&#xff0c;同步也增加了许多新的方法&#xff0c;主要有Text Blocks、chars()、codePoints()、describeConstable()、formatted()、indent()、isBlank()、isEmpty()、lines()、repeat()、strip()、stripLeading()、stripIn…

DolphinScheduler 3.1.4详细教程

文章目录 第一章 DolphinScheduler介绍1.1 关于DolphinScheduler1.2 特性1.3 名词解释1.3.1 名词解释1.3.2 模块介绍 第二章 DolphinScheduler系统架构2.1 系统架构图2.2 架构说明该服务包含&#xff1a; 2.3 启动流程活动图2.4 架构设计思想2.4.1 去中心化vs中心化2.4.1.1 中心…

北京地铁:充分发挥数据价值,全面提升业财融合能力

4月19日-4月21日&#xff0c;一年一度的用友BIP技术大会圆满召开。来自行业领先企业的CIO/CDO、生态伙伴、开发者、分析师、媒体等共聚北京用友产业园&#xff0c;了解最新技术发展趋势、探讨行业热点话题。会上&#xff0c;北京地铁运营有限公司&#xff08;以下简称“北京地铁…

使用 ChatGPT 辅助学习——为自己找一个老师

我们每个人都有许多标签&#xff0c;例如高中生、成绩中等、文科&#xff0c;根据这些标签我和其他拥有相同标签的人分配了相同的教程、班级和老师&#xff0c;这可以带来效率上的提升&#xff0c;因为同一份教程、老师就可以服务几十上百人&#xff0c;而无须为每个人定制&…

2023年腾讯云轻量服务器性能评测

腾讯云轻量应用服务器性能评测 轻量应用服务器是腾讯云推出的一款开箱即用的轻量级的云服务器&#xff0c;轻量服务器CPU内存带宽配置更高&#xff0c;价格却又很便宜&#xff0c;很多同学认为是不是轻量应用服务器性能不行呀&#xff0c;轻量服务器和云服务器有什么区别&…

浪潮盒子IPBS9505-多遥控版-S905L/M2芯片-安卓4.4.2-线刷固件包

浪潮盒子IPBS9505-多遥控版-S905L&#xff0f;M2芯片-安卓4.4.2-线刷固件包-内有教程和短接点-当贝纯净桌面。 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&…

因子挖掘框架cs优缺点介绍和使用说明

cs框架的优点和缺点 优点和ts一样,就是速度非常快缺点有好几个:必须使用根据过去一定天数计算因子值,持有一定天数之后再平衡的模式;必须使用连续的数据,如果是期货期权等需要合成连续数据。资金不足的时候不会拒单。cs框架使用方法 设计理念 计算因子由用户进行计算,因…

Springboot +Flowable,任务认领和回退(一)

一.简介 有的时候&#xff0c;一个任务节点会存在多个候选人&#xff0c;例如&#xff1a;张三提交一个任务&#xff0c;这个任务即可以由李四处理&#xff0c;又可以由王五处理&#xff0c;那么针对这种多个任务候选人的情况&#xff0c;该如何处理&#xff1f; 二.绘制流程…

项目管理-数据管理能力DCMM模型

DCMM 数据管理能力成熟度评估模型简介 DCMM&#xff08;Data Management Capability Maturity Assessment Model&#xff0c;数据管理能力成熟度评估模型&#xff09;是我国首个数据管理领域国家标准。该标准将组织对象的数据管理划分为八大能力域&#xff08;数据战略、数据治…

python4delphi之初体验

最近需要做一个excel导入的工具, excel表格是python的强项,于是想delphi结合python实现 delphi环境xe2 python 3.6.6 上图可以看到,真的很爽,我在vscode写python脚本,然后给delphi调用 读取了一个excel文件,打印出了列头。 最爽的是,我在没wps,office环境的机…

( “图“ 之 二分图 ) 785. 判断二分图 ——【Leetcode每日一题】

❓785. 判断二分图 难度&#xff1a;中等 存在一个 无向图 &#xff0c;图中有 n 个节点。其中每个节点都有一个介于 0 到 n - 1 之间的唯一编号。给你一个二维数组 graph &#xff0c;其中 graph[u] 是一个节点数组&#xff0c;由节点 u 的邻接节点组成。形式上&#xff0c;…

MySQL一次大量内存消耗的跟踪

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。文章来源&#xff1a;GreatSQL社区原创 线上使用MySQL8.0.25的数据库&#xff0c;通过监控发现数据库在查询一个视图(80张表的u…

xcode打包导出ipa

xcode打包导出ipa 众所周知&#xff0c;在开发苹果应用时需要使用签名&#xff08;证书&#xff09;才能进行打包安装苹果IPA&#xff0c;作为刚接触ios开发的同学&#xff0c;只是学习ios app开发内测&#xff0c;并没有上架appstore需求&#xff0c;对于苹果开发者账号认证需…

Java基础(十九)反射机制

1. 反射(Reflection)的概念 1.1 反射的出现背景 Java程序中&#xff0c;所有的对象都有两种类型&#xff1a;编译时类型和运行时类型&#xff0c;而很多时候对象的编译时类型和运行时类型不一致。 Object obj new String(“hello”); obj.getClass() 例如&#xff1a;某些变…

Pytorch对机器学习模型的安全漏洞攻击方法之Fast Gradient Sign Attack(FGSM,快速梯度符号攻击)

原论文:EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES 一般本人的习惯是先看论文熟悉它,然后代码去实现它,这样感觉要好点。因为论文讲解的比较全面和一些实验对比还有很多的引用等,另外大家知道好论文基本都是英文,所以对于英文弱点的伙伴们可能需要多花点时间去研读了…

Linux 多线程(1)线程概念与线程控制

多线程&#xff1a;概念、线程控制&#xff08;创建、终止、等待、分离&#xff09;&#xff0c;线程安全&#xff08;问题&实现&#xff09;&#xff0c;应用&#xff08;生产者与消费者模型&#xff0c;线程池&#xff0c;单例模式&#xff09; &#xff08;重要&#xf…

6个月的测试,来面试居然要15K,我一问连5K都不值

2023年4月份我入职了深圳某家创业公司&#xff0c;刚入职还是很兴奋的&#xff0c;到公司一看我傻了&#xff0c;公司除了我一个自动化测试&#xff0c;公司的测试人员就只有2个开发3个前端1个测试还有2个UI&#xff0c;在粗略了解公司的业务后才发现是一个从零开始的项目&…

Java版本-招投标采购系统源代码-高效管控招采流程-降低采购成本

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及…

计算机网络面试题(上)

1.TCP/IP 网络模型有哪几层&#xff1f; TCP/IP 网络通常是由上到下分成 4 层&#xff0c;分别是应用层&#xff0c;传输层&#xff0c;网络层和网络接口层。 每一层的封装格式&#xff1a; 网络接口层的传输单位是帧&#xff08;frame&#xff09;&#xff0c;IP 层的传输单位…
最新文章