如何用Python修改点云PLY文件并覆盖原文件?
覆盖修改后的PLY点云文件方案
方法一:使用plyfile库(轻量灵活)
plyfile是专门处理PLY格式的Python库,适合精细控制文件结构:
- 读取并解析原PLY文件
from plyfile import PlyData, PlyElement import numpy as np # 读取原文件 ply_data = PlyData.read("lon dress pointcloud.ply") points = ply_data['vertex'].data
- 实现RGB转YCbCr转换(假设RGB值为0-255的整数)
def rgb_to_ycbcr(r, g, b): y = 0.299 * r + 0.587 * g + 0.114 * b cb = 128 - 0.168736 * r - 0.331264 * g + 0.5 * b cr = 128 + 0.5 * r - 0.418688 * g - 0.081312 * b # 转换为整数(保持与原RGB一致的格式) return np.round(y).astype(np.uint8), np.round(cb).astype(np.uint8), np.round(cr).astype(np.uint8) # 提取RGB数据并转换 r = points['r'] g = points['g'] b = points['b'] y, cb, cr = rgb_to_ycbcr(r, g, b)
- 构造新的顶点数据并定义PLY头部
# 构造新的顶点数组,保留x,y,z,替换为Y,Cb,Cr new_points = np.array( list(zip(points['x'], points['y'], points['z'], y, cb, cr)), dtype=[('x', 'f4'), ('y', 'f4'), ('z', 'f4'), ('Y', 'u1'), ('Cb', 'u1'), ('Cr', 'u1')] ) # 创建新的PLY元素和头部 vertex_element = PlyElement.describe(new_points, 'vertex') new_ply_data = PlyData([vertex_element], text=ply_data.text)
- 覆盖写入原文件
# 直接写入原路径即可覆盖 new_ply_data.write("lon dress pointcloud.ply")
方法二:使用Open3D库(更适合点云可视化/处理场景)
Open3D是功能全面的点云处理库,操作更简洁:
- 读取原点云文件
import open3d as o3d import numpy as np pcd = o3d.io.read_point_cloud("lon dress pointcloud.ply") points = np.asarray(pcd.points) colors = np.asarray(pcd.colors) # Open3D默认颜色是0-1的浮点数,若原文件是0-255需转换
- RGB转YCbCr(适配Open3D的颜色范围)
def rgb_to_ycbcr_open3d(rgb): # 若颜色是0-1浮点数,先转0-255整数 rgb_255 = (rgb * 255).astype(np.uint8) r, g, b = rgb_255[:, 0], rgb_255[:, 1], rgb_255[:, 2] y = 0.299 * r + 0.587 * g + 0.114 * b cb = 128 - 0.168736 * r - 0.331264 * g + 0.5 * b cr = 128 + 0.5 * r - 0.418688 * g - 0.081312 * b # 转回0-1浮点数适配Open3D ycbcr = np.stack([y, cb, cr], axis=1) / 255.0 return ycbcr ycbcr_colors = rgb_to_ycbcr_open3d(colors)
- 创建新点云并覆盖写入
# 创建新点云对象 new_pcd = o3d.geometry.PointCloud() new_pcd.points = o3d.utility.Vector3dVector(points) new_pcd.colors = o3d.utility.Vector3dVector(ycbcr_colors) # 覆盖写入原文件 o3d.io.write_point_cloud("lon dress pointcloud.ply", new_pcd)
注意:覆盖原文件前务必先备份原始数据,避免操作失误导致数据丢失
内容的提问来源于stack exchange,提问作者obby
相关产品推荐
相关产品推荐

