点云ply文件相关学习记录

PLY是一种由Stanford大学开发的三维模型数据格式,常用于图形学研究。文件由头部和元素数据列表构成,包含顶点、面片等信息,支持ASCII或二进制格式。文章详细介绍了PLY文件的结构、头部信息、顶点和面片列表,以及如何读取PLY文件。
摘要由CSDN通过智能技术生成

点云学习笔记

参考:

PLY格式文件具体解释

点云ply格式文件详解_weixin_44324586的博客-CSDN博客

点云格式介绍(二)_点云数据格式_Coding的叶子的博客-CSDN博客

目录

结构

头部

Vertex List

Face List

读文件


PLY文件格式是Stanford大学开发的一套三维mesh模型数据格式,图形学领域内非常多著名的模型数据,比方Stanford的三维扫描数据库(当中包含非常多文章中会见到的Happy Buddha, Dragon, Bunny兔子),Geogia Tech的大型几何模型库。北卡(UNC)的电厂模型等,最初的模型都是基于这个格式的。

PLY多边形文件格式的开发目标是建立一套针对多边形模型的,结构简单可是可以满足大多数图形应用须要的模型格式,并且它同意以ASCII码格式或二进制形式存储文件。PLY的开发人员希望。这样一套既简单又灵活的文件格式,可以帮助开发人员避免反复开发文件格式的问题。然而因为各种各样的原因,在工业领域内,新的文件格式仍然在不断的出现,可是在图形学的研究领域中,PLY还是种经常使用且关键的文件格式。

PLY作为一种多边形模型数据格式,不同于三维引擎中经常使用的场景图文件格式和脚本文件。每一个PLY文件仅仅用于描写叙述一个多边形模型对象(Object),该模型对象能够通过诸如顶点、面等数据进行描写叙述,每一类这种数据被称作一种元素(Element)。相比于现代的三维引擎中所用到的各种复杂格式。PLY实在是种简单的不能再简单的文件格式,可是假设细致研究就会发现,就像设计者所说的,这对于绝大多数的图形应用来说已经是足够用了。

结构

PLY的文件结构简单:文件头+元素数据列表。当中文件头中以行为单位描写叙述文件类型、格式与版本号、元素类型、元素的属性等,然后就依据在文件头中所列出元素类型的顺序及其属性,依次记录各个元素的属性数据。

典型的PLY文件结构: 

        头部 

        顶点列表 Vertex List

        面片列表 Face List

      (其它元素列表)(lists of other elements)

点云组成可以是以下几种形式数据的排列组合。

        (1)x、y、z:点云的空间坐标。

        (2)i:强度值,强度反应了点的密集成度。

        (3)r、g、b:rgb色彩信息。

        (4)a:a代表alpha(透明度)。

        (5)nx、ny、nz:n代表Normal,点云的法向量。

头部

头部是一系列以回车结尾的文本行。用来描写叙述文件的剩余部分。如:

ply
format ascii 1.0    { ascii/binary, format version number }
comment Created by Blender 2.77 (sub 0) - www.blender.org, source file: ''        { comments keyword specified, like all lines }
element vertex 35034    {定义“vertex”(顶点)元素,在文件里有35034个}
property float x    {顶点的第一个元素x,浮点型}
property float y    {顶点的第一个元素y,浮点型}
property float z    {顶点的第一个元素z,浮点型}
property float nx    {n代表Normal,点云的法向量}
property float ny    {同上}
property float nz    {同上}
property uchar red    {顶点颜色r}
property uchar green    {顶点颜色G}
property uchar blue    {顶点颜色B}
element face 11678    {有11678个face,下面是property对应面的组成}
property list uchar uint vertex_indices    { “vertex_indices”(顶点素引)是一列整数 "vertex_indices" is a list of ints }
end_header    {   划定头部结尾   }

在“element”行之后列出的属性定义了属性的数据类型,以及每个元素的属性出现的顺序。

        element   <元素名>   <在文件里的个数> 

        property   <数据类型>   <属性名-1> 

        property   <数据类型>   <属性名-2> 

        property   <数据类型>   <属性名-3>

属性可以具有两种数据类型:标量、字符串和列表。其中字节数非常重要,并且在实现过程中不能改动以使这些文件可移植。

        名称      类型           字节数 

         ------------------------------- 

         int8        字符                    1 

         uint8      非负字符           1 

         int16      短整型               2 

         uint16    非负短整型       2 

         int32      整型                   4 

         uint32    非负整型           4 

         float32   单精度浮点数   4 

         float64   双精度浮点数   8

Vertex List

上述例子中没出现的几个元素,在这里记录一下,万一以后遇到

property float confidence #置信度,浮点型
property float intensity #强度(反应了点的密集程度),浮点型
property float alpha #透明度,浮点型

继续上述例子

  • 17~35050行都是Vertex List的内容(35050-17+1=35034,与在头部中定义的顶点元素数目相同)
  • vertex  list有9列(每行有9个元素),分别是x,y,z,nx,ny,nz,red,green,blue

Face List

继续上述例子

  • 35051~46728行都是Vertex List的内容(46728-35051+1=11678,与在头部中定义的face数目相同)
  • vertex  list有4列(每行有9个元素),倒数3个是vertex list中的索引

读文件

import plyfile
plydata = plyfile.PlyData.read(f)
print(plydata)#头文件
print(plydata.elements[0].data[0])#第一行点
print(plydata.['vertex'])#头文件
print(plydata['vertex'].data[0])#第一行点
print("type:",type(plydata.elements[0].data))#点的数据类型
pc = plydata['vertex'].data
pc_array = np.array([[x, y, z, nx, ny, nz, r, g, b] for x, y, z, nx, ny, nz, r, g, b in pc])#此处矩阵的所有参数都必须被拉出来,参数数量查看头文件

参考:

PLY格式文件具体解释

点云ply格式文件详解_weixin_44324586的博客-CSDN博客

点云格式介绍(二)_点云数据格式_Coding的叶子的博客-CSDN博客

【三维重建学习之路01】点云ply文件的读写、修改_plyfile使用_啊粥的博客-CSDN博客

点云转换为深度图需要进行以下步骤: 1. 读取ply文件并将其转换为点云数据结构。 2. 确定深度图的分辨率和范围。 3. 将点云中的每个点转换为深度图像素坐标。 4. 将深度值分配给每个深度图像素。 以下是一个Python示例代码,可以将ply文件转换为深度图: ```python import numpy as np import open3d as o3d from PIL import Image # 读取PLY文件并将其转换为点云数据结构 pcd = o3d.io.read_point_cloud('input_cloud.ply') # 设置深度图的分辨率和范围 resolution = (512, 512) z_min = 0 z_max = 5 # 将点云中的每个点转换为深度图像素坐标 depth_image = np.zeros(resolution, dtype=np.float32) for point in np.asarray(pcd.points): x, y, z = point i = int((x / z) * resolution[0] / 2 + resolution[0] / 2) j = int((y / z) * resolution[1] / 2 + resolution[1] / 2) if i >= 0 and i < resolution[0] and j >= 0 and j < resolution[1]: depth_image[j, i] = z # 将深度值分配给每个深度图像素 depth_image = (depth_image - z_min) / (z_max - z_min) * 255 depth_image = depth_image.astype(np.uint8) # 保存深度图 Image.fromarray(depth_image).save('output_depth.png') ``` 在此示例代码中,我们使用了Open3D库来读取PLY文件并将其转换为点云数据结构。然后,我们定义了深度图的分辨率和范围,并将点云中的每个点转换为深度图像素坐标。最后,我们将深度值分配给每个深度图像素,并将其保存为PNG文件。请注意,此示例代码仅适用于点云中没有重叠的情况。如果点云中存在重叠区域,则需要进行额外处理以避免深度图中的深度信息丢失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值