1. 点云数据读取与可视化

任务目标

本案例要求使用Open3D读取PCD或PLY格式的点云文件,并启动一个支持旋转、缩放和平移的3D可视化窗口。完成本案例后,你将具备处理点云数据的最基础能力——数据加载与交互式观察,这是后续所有点云处理流程的起点。

环境依赖

需要Python 3.8+环境,并安装Open3D库。Open3D提供了跨平台的点云I/O与可视化支持,相比PCL更轻量且易于快速验证。

pip install open3d

实现代码

以下代码实现了完整的读取与可视化闭环。核心逻辑分为三步:加载文件(自动识别PCD/PLY格式)、打印点云信息(用于确认读取成功)、启动可视化窗口(内置鼠标交互控制)。

import open3d as o3d
import sys
import os

def load_and_visualize(file_path):
    """
    读取点云文件并启动可视化窗口。
    支持格式:.pcd, .ply
    交互说明:左键拖拽旋转,滚轮缩放,右键拖拽平移。
    """
    # 检查文件是否存在
    if not os.path.exists(file_path):
        print(f"错误:文件不存在 - {file_path}")
        sys.exit(1)

    # 检查扩展名是否支持
    ext = os.path.splitext(file_path)[1].lower()
    if ext not in ['.pcd', '.ply']:
        print(f"错误:不支持的文件格式 '{ext}',仅支持 .pcd 和 .ply")
        sys.exit(1)

    # 读取点云
    pcd = o3d.io.read_point_cloud(file_path)

    # 检查是否读取到有效点云
    if pcd.is_empty():
        print("错误:点云为空或读取失败,请检查文件内容")
        sys.exit(1)

    # 输出点云基本信息,用于确认读取成功
    print(f"成功读取点云:{file_path}")
    print(f"点数:{len(pcd.points)}")
    if pcd.has_colors():
        print("包含颜色信息")
    if pcd.has_normals():
        print("包含法向量信息")

    # 创建可视化窗口并显示点云
    # 默认支持:左键旋转、滚轮缩放、右键平移
    o3d.visualization.draw_geometries([pcd], 
                                      window_name="Open3D 点云可视化",
                                      width=800, 
                                      height=600)

if __name__ == "__main__":
    # 如果没有提供命令行参数,则使用示例文件
    if len(sys.argv) > 1:
        path = sys.argv[1]
    else:
        # 生成一个示例点云文件用于演示(螺旋线形状)
        print("未指定文件,正在生成示例点云...")
        import numpy as np
        demo_pcd = o3d.geometry.PointCloud()
        theta = np.linspace(0, 4 * np.pi, 2000)
        z = np.linspace(0, 2, 2000)
        x = np.cos(theta)
        y = np.sin(theta)
        demo_pcd.points = o3d.utility.Vector3dVector(np.column_stack((x, y, z)))
        demo_path = "demo_spiral.pcd"
        o3d.io.write_point_cloud(demo_path, demo_pcd)
        print(f"示例文件已生成:{demo_path}")
        path = demo_path

    load_and_visualize(path)

运行与验证

运行方式:

# 方式一:直接运行(自动生成示例螺旋点云并可视化)
python pointcloud_viewer.py

# 方式二:指定自己的点云文件
python pointcloud_viewer.py your_data.pcd
python pointcloud_viewer.py your_data.ply

验证通过条件:

  1. 程序无报错退出,控制台输出点云文件路径和点数(例如 点数:2000);
  2. 弹出标题为“Open3D 点云可视化”的3D窗口,窗口中可见三维点云形状;
  3. 在窗口中操作:按住左键拖拽可旋转视角,滚动滚轮可缩放,按住右键拖拽可平移视角,三种操作均实时响应;
  4. 关闭窗口后程序正常结束。

常见问题

  • 窗口黑屏或闪退:检查Open3D版本(建议≥0.15.0),并确认系统支持OpenGL图形渲染。
  • 读取PLY文件无颜色:部分PLY文件本身不包含颜色属性,属正常现象,不影响几何显示。
  • 点云显示为一条线:当点云点数极少或分布呈线性时,可尝试在读取后执行 pcd.estimate_normals() 改善渲染效果,但本案例核心功能不受影响。