使用PlyData向PLY文件添加新点时遇AttributeError错误求助
解决方法
错误原因
PlyData构造函数需要传入PlyElement对象的列表,你直接将读取到的plydata(PlyData实例)放入列表,程序会尝试访问它的name属性,但PlyData本身没有这个属性,因此抛出AttributeError。另外你定义的数组dtype有误:vertex_indices是面(face)元素的字段,不是顶点(vertex)的字段,顶点应该包含坐标(x/y/z)和颜色信息。
修正后的代码
from plyfile import PlyData, PlyElement import numpy # 读取原PLY文件 with open(filepath, 'rb') as f: plydata = PlyData.read(f) # 定义新顶点的dtype(匹配标准vertex元素结构) new_vertices_array = numpy.array( [(0.0, 1.0, 2.0, 255, 255, 255), (0.0, 2.0, 3.0, 255, 0, 0)], dtype=[('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('red', 'u1'), ('green', 'u1'), ('blue', 'u1')] ) # 创建新的PlyElement new_vertex_element = PlyElement.describe(new_vertices_array, 'vertex') # 合并原PLY的元素与新元素:提取原PlyData中的所有元素,替换或追加新的vertex元素 # 这里假设原文件已有vertex元素,我们将新顶点追加到原顶点后 original_vertex = plydata['vertex'] combined_vertex_data = numpy.concatenate([original_vertex.data, new_vertices_array]) combined_vertex_element = PlyElement.describe(combined_vertex_data, 'vertex') # 收集所有元素:替换原vertex为合并后的,保留其他元素(如face等) elements = [] for elem in plydata.elements: if elem.name == 'vertex': elements.append(combined_vertex_element) else: elements.append(elem) # 写入新PLY文件 with open('colored_points.ply', mode='wb') as f: PlyData(elements, text=True).write(f)
关键说明
- 提取原
PlyData中的elements列表,替换其中的vertex元素为合并后的版本,保留其他元素(比如面、法线等) - 确保新顶点的dtype与原文件的
vertex元素结构一致,否则会导致文件无法正常读取 - 如果原文件没有颜色字段,需要调整dtype以匹配原结构,或者修改原元素定义添加颜色字段
内容的提问来源于stack exchange,提问作者Ahmed Amer
相关产品推荐
相关产品推荐

