【问题标题】:How to export 3D pointcloud data in HDF5 datasets to .ply file format如何将 HDF5 数据集中的 3D 点云数据导出为 .ply 文件格式
【发布时间】:2021-10-25 03:36:39
【问题描述】:

给定一个 HDF5 文件,其下具有 HDF5 数据集类型的 complete_pcds,如下所示。

这个 complete_pcds 有点像一个数组,其中每一行都包含一个 3D 模型的数据。我想将此 complete_pcds 的每一行转换为 .ply 文件,目的是最终将其视为 3D 模型。包括 complete_pcds 文件的属性以供参考。

【问题讨论】:

  • 什么是 .ply 文件?你能描述一下格式吗?读取 HDF5 数据很容易。唯一的挑战是将其格式化为所需的文件格式。
  • 仅多边形版本(.ply 文件)和 .pcd 文件格式是曾经用于存储 3D 点云数据的格式。我们可以分两步完成吗:1)通过从 HDF5 文件中读取 complete_pcds 的行来生成 .txt 文件,以及 2)然后将如此获得的 .txt 文件转换为 .ply 文件。任何建议都会很有价值
  • 是否有 .ply 和 .pcd 文件格式的参考?另外,complete_pcds 数据集的格式(dtype)是什么?它位于数据集数据空间和数据类型下的常规对象信息选项卡上(或者您可以使用 Python/h5py 作为 ,dtype 属性)。顺便说一句,你关心使用哪种语言(Python、C/C++、FORTRAN、?)
  • 感谢您的回复。我已经编辑并添加了一个包含 complete_pcds 文件的数据类型和属性的图像。就语言而言,没有语言限制,因为主要是我的目标是最终输出为 .ply 文件。此外,作为 .ply/.pcd 文件格式的参考,您是否希望获得有关这些格式的详细说明??
  • 从 HDF5 数据直接转到 .ply 文件是直接的。无需创建中间文件。 (我没有研究过 .pcd,但假设它是相似的。)您的数据集只有浮点数。我假设这些是顶点(点)。您是否在某处定义了面孔(元素)?还是你只想要积分?

标签: python multidimensional-array hdf5 point-clouds h5py


【解决方案1】:

这是我试图回答的问题。我对您的数据和架构仍然有些模糊。 您的屏幕截图显示(2400, 2048, 3) 的形状。据此,我假设您需要 2400 个输出文件,每个文件有 2048 个顶点,其中 x,y,x 坐标是数据集 [file#,vertex#,0:2] 中的值。此外,您的文件没有任何元素面定义,因此不会创建它们。如果这是正确的,请继续阅读……如果不是,请更正/澄清我的假设。

另外,我创建了一个简单的 HDF5 进行测试。创建它的代码在答案的末尾。该示例有 4 行数据;每行有 8 个点来定义立方体的角(每行中的立方体都被缩放 - 第一行是 1x1x1,第二行是 2x2x2,依此类推)。

以下是我用于 ply 格式的参考:

将数据提取到 .ply 文件的代码:

import h5py
filename = 'MVP_Train_CP_ex.h5'
with h5py.File(filename,'r') as h5f: 
    ply_ds = h5f['complete_pcds']
    print(ply_ds.shape, ply_ds.dtype)
    for cnt, row in enumerate(ply_ds):
        v_cnt = row.shape[0]
        with open(f'pcds_{str(cnt)}.ply','w') as ply_f:
            ply_f.write('ply\n')
            ply_f.write('format ascii 1.0\n')
            ply_f.write(f'comment row {cnt} exported from:{filename}\n')
            ply_f.write(f'element vertex {v_cnt}\n') # variable # of vertices
            ply_f.write('property float x\n')
            ply_f.write('property float y\n')
            ply_f.write('property float z\n')
            ply_f.write('end_header\n')
            for vertex in row:
                ply_f.write(f'{vertex[0]:#6.3g} {vertex[1]:#6.3g} {vertex[2]:#6.3g}\n')

创建示例文件的代码:

import numpy as np
import h5py 
filename = 'MVP_Train_CP_ex.h5'
with h5py.File(filename,'w') as h5f: 
    vertices = np.empty(shape=(4,8,3))
    for i in range(vertices.shape[0]):
        vertices[i,:,:] = (i+1)* np.array([ \
                    [ 0.0, 0.0, 0.0],
                    [ 1.0, 0.0, 0.0],
                    [ 1.0, 1.0, 0.0],
                    [ 0.0, 1.0, 0.0],
                    [ 0.0, 0.0, 1.0],
                    [ 1.0, 0.0, 1.0],
                    [ 1.0, 1.0, 1.0],
                    [ 0.0, 1.0, 1.0]])    
    
    ds = h5f.create_dataset('complete_pcds',data=vertices)

【讨论】:

  • 感谢您的耐心和努力。您能否删除标题后的评论(ply_f.write('comment start of vertex list \n')),因为这一行我无法渲染在 3D 查看器软件中创建的 3D 文件,并且有抛出一个错误。一旦那条线被删除,它就会像魅力一样发挥作用。之后我将能够接受您的回答。
  • 有趣....cmets 应该被忽略。我将会。注意:您可以从代码中删除该行。
  • 是的,应该避免标题后面的 cmets。谢谢:)
猜你喜欢
  • 2019-11-19
  • 1970-01-01
  • 2019-08-07
  • 2021-06-10
  • 2021-02-22
  • 2016-03-22
  • 2022-06-17
  • 2018-12-02
  • 2015-11-28
相关资源
最近更新 更多