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)即可固定随机序列。