使用plyfile库将numpy点云数组转为PLY网格文件报错求助
解决plyfile库转换点云为PLY文件的ValueError问题
你遇到的ValueError: only one-dimensional arrays are supported错误,是因为构造结构化数组的方式不符合plyfile的要求——PlyElement.describe只接受一维结构化数组,每个元素要包含x、y、z三个字段,而你直接给二维数组指定结构化dtype,得到的是二维的结构化数组,维度不匹配。
下面是两种可行的修正方案:
方案一:用np.core.records.fromarrays转换
先将原始二维数组转为普通float32数组,再通过fromarrays生成符合要求的一维结构化数组:
import numpy as np from plyfile import PlyElement, PlyData vertex = [[52.45258174, 78.63234647, -0.90487998], [52.46268174, 78.68184647, 1.09133402], [52.48928449, 78.7930997, -0.90905187], [52.49938449, 78.84259974, 1.08716213], [52.5921233, 78.92200466, -0.91276864], [52.6022233, 78.97150466, 1.08344536]] # 转为普通float32二维数组 vertex_np = np.array(vertex, dtype='f4') # 转置后按列生成结构化数组,得到一维结构 structured_vertex = np.core.records.fromarrays( vertex_np.T, dtype=[('x', 'f4'), ('y', 'f4'), ('z', 'f4')] ) # 创建PlyElement并写入文件 PLY_vertices = PlyElement.describe(structured_vertex, 'vertex') with open('point_cloud.ply', 'wb') as f: PlyData([PLY_vertices], text=True).write(f)
方案二:直接构造元组列表生成结构化数组
将每个坐标子列表转为元组,再构造一维结构化数组:
import numpy as np from plyfile import PlyElement, PlyData vertex = [[52.45258174, 78.63234647, -0.90487998], [52.46268174, 78.68184647, 1.09133402], [52.48928449, 78.7930997, -0.90905187], [52.49938449, 78.84259974, 1.08716213], [52.5921233, 78.92200466, -0.91276864], [52.6022233, 78.97150466, 1.08344536]] # 每个坐标转元组,构造一维结构化数组 structured_vertex = np.array([tuple(v) for v in vertex], dtype=[('x', 'f4'), ('y', 'f4'), ('z', 'f4')]) PLY_vertices = PlyElement.describe(structured_vertex, 'vertex') # 保存PLY文件 with open('point_cloud.ply', 'wb') as f: PlyData([PLY_vertices], text=True).write(f)
运行任意一种方案,都能成功生成包含你的点云数据的PLY文件。
内容的提问来源于stack exchange,提问作者Sher
相关产品推荐
相关产品推荐

