如何将 HDF5 数据集中的 3D 点云数据导出为 .ply 文件格式
How to export 3D pointcloud data in HDF5 datasets to .ply file format
给定一个 HDF5 文件,其下有 complete_pcds 类型的 HDF5 数据集,如下所示。
这个 complete_pcds 有点像一个数组,其中每一行包含一个 3D 模型的数据。我想将此 complete_pcds 的每一行转换为一个 .ply 文件,目的是最终将其作为 3D 模型查看。包括 complete_pcds 文件的属性以供参考。
这是我尝试的答案。我对您的数据和模式仍然有些模糊。
您的屏幕截图显示 (2400, 2048, 3)
的形状。由此我假设您需要 2400 个输出文件,每个文件有 2048 个顶点,其中 x、y、x 坐标是来自数据集 [file#,vertex#,0:2] 的值。此外,您的文件没有任何元素面定义,因此不会创建它们。如果这是正确的,请继续阅读...如果不正确,请 correct/clarify 我的假设。
另外,我创建了一个简单的 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)
给定一个 HDF5 文件,其下有 complete_pcds 类型的 HDF5 数据集,如下所示。
这个 complete_pcds 有点像一个数组,其中每一行包含一个 3D 模型的数据。我想将此 complete_pcds 的每一行转换为一个 .ply 文件,目的是最终将其作为 3D 模型查看。包括 complete_pcds 文件的属性以供参考。
这是我尝试的答案。我对您的数据和模式仍然有些模糊。
您的屏幕截图显示 (2400, 2048, 3)
的形状。由此我假设您需要 2400 个输出文件,每个文件有 2048 个顶点,其中 x、y、x 坐标是来自数据集 [file#,vertex#,0:2] 的值。此外,您的文件没有任何元素面定义,因此不会创建它们。如果这是正确的,请继续阅读...如果不正确,请 correct/clarify 我的假设。
另外,我创建了一个简单的 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)