1. 生成随机点云数据
任务目标
使用Python生成包含随机位置(x, y, z)和颜色(r, g, b)的三维点云数据,并保存为标准PLY格式文件,以便后续点云处理案例直接读取使用。
环境依赖
仅需Python 3.6+标准库,无需安装第三方点云库。文件写入使用struct模块进行二进制打包。
完整实现
import random
import struct
def generate_random_point_cloud(num_points=1000, seed=None):
"""生成随机点云数据,返回点列表 [(x,y,z,r,g,b), ...]"""
if seed is not None:
random.seed(seed)
points = []
for _ in range(num_points):
x = random.uniform(-10.0, 10.0)
y = random.uniform(-10.0, 10.0)
z = random.uniform(-10.0, 10.0)
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
points.append((x, y, z, r, g, b))
return points
def write_ply_binary(points, filename):
"""将点云写入二进制PLY文件(vertex元素,包含x,y,z和red,green,blue属性)"""
vertex_count = len(points)
header = f"""ply
format binary_little_endian 1.0
comment Generated by Python random point cloud
element vertex {vertex_count}
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
end_header
"""
with open(filename, 'wb') as f:
f.write(header.encode('ascii'))
for x, y, z, r, g, b in points:
# float32 为4字节,uchar 为1字节,每个点共15字节
f.write(struct.pack('<fffBBB', x, y, z, r, g, b))
if __name__ == '__main__':
# 生成1000个随机点并保存
points = generate_random_point_cloud(num_points=1000, seed=42)
write_ply_binary(points, 'random_cloud.ply')
print(f'已生成 random_cloud.ply,包含 {len(points)} 个点')
运行方式
python generate_point_cloud.py
验证方法
运行后检查输出文件是否生成,并确认文件头信息正确:
head -c 200 random_cloud.ply
预期输出(文件头部分):
ply
format binary_little_endian 1.0
comment Generated by Python random point cloud
element vertex 1000
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
end_header
通过条件:文件头显示element vertex 1000,且文件大小约为 1000 × 15字节 + 头部长度 ≈ 15,000 + 头部字节数。也可使用支持PLY的软件(如MeshLab、CloudCompare)打开文件,确认能正确显示1000个带颜色的随机点。
常见问题
- 文件打不开:确认使用二进制模式写入(
'wb'),且头部与数据之间无多余空格或换行。 - 颜色显示异常:颜色属性顺序必须与头部声明一致(red, green, blue),且使用
uchar类型(0-255)。 - 随机结果不可复现:设置
seed参数(如示例中的42)即可固定随机序列。