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

任务目标

本案例将使用 Open3D 读取一个 PCD 格式的点云文件,并完成可视化。通过本案例,你将掌握点云数据的基本读取流程、坐标信息查看方法以及交互式可视化窗口的操作方式。

环境准备

需要安装 open3d 库(建议版本 ≥ 0.17.0)。若尚未安装,执行以下命令:

pip install open3d

数据准备

本案例使用 Open3D 自带的示例点云文件 fragment.pcd(包含约 4.6 万个点,描述一个室内场景片段)。该文件会随库一起安装,无需额外下载。

完整实现代码

import open3d as o3d
import numpy as np

# 1. 读取PCD文件
pcd = o3d.io.read_point_cloud("fragment.pcd")
if pcd.is_empty():
    raise RuntimeError("点云读取失败,请检查文件路径")

# 2. 打印点云基本信息
print("点云点数:", len(pcd.points))
print("点云是否包含颜色:", pcd.has_colors())
print("点云是否包含法向量:", pcd.has_normals())

# 3. 获取并显示坐标范围
points = np.asarray(pcd.points)
print("X范围: [{:.3f}, {:.3f}]".format(points[:, 0].min(), points[:, 0].max()))
print("Y范围: [{:.3f}, {:.3f}]".format(points[:, 1].min(), points[:, 1].max()))
print("Z范围: [{:.3f}, {:.3f}]".format(points[:, 2].min(), points[:, 2].max()))

# 4. 可视化(窗口关闭后程序继续执行)
o3d.visualization.draw_geometries([pcd], window_name="PCD点云可视化", width=800, height=600)

# 5. 验证:统计有效点比例(过滤非有限数值)
valid_mask = np.isfinite(points).all(axis=1)
print("有效点比例: {:.2f}%".format(100 * valid_mask.mean()))

运行方式

将上述代码保存为 read_pcd.py,在终端中运行:

python read_pcd.py

确保当前工作目录下存在 fragment.pcd 文件。若文件不存在,可将代码中的文件名替换为你的 PCD 文件路径。

验证方法与通过标准

运行程序后,按以下步骤确认执行成功:

  1. 控制台输出:应显示点云点数为 46040 左右,且坐标范围在合理区间(X/Y/Z 均约在 -1.5 到 1.5 之间)。若输出“点云读取失败”,说明文件路径错误。
  2. 可视化窗口:弹出 3D 窗口,显示一个室内场景的彩色点云(若原始文件无颜色,则显示灰色点云)。可通过鼠标左键旋转视角、滚轮缩放、右键平移。
  3. 有效点比例:输出应为 100.00%,表示所有点均为有限数值,无 NaN 或无穷值。
  4. 程序退出:关闭可视化窗口后,程序自动结束,无报错信息。

常见问题

  • 读取失败:检查文件路径是否正确,或改用 o3d.io.read_point_cloud("你的路径/fragment.pcd") 路径。
  • 窗口不显示:在远程服务器或无图形界面环境下,需配置 X11 转发或改用 headless 渲染模式(本案例不涉及)。
  • 颜色缺失:若点云文件本身不含 RGB 信息,has_colors() 返回 False,可视化时点云显示为灰色,属正常现象。
PCD点云读取与可视化流程 ① 读取PCD read_point_cloud() ② 数据检查 点数/颜色/法向量 ③ 坐标范围 X/Y/Z min-max ④ 可视化窗口 draw_geometries() ⑤ 有效性验证 np.isfinite() 比例 ⑥ 通过标准 窗口显示+无报错 关键输出示例: 点云点数: 46040 点云是否包含颜色: True 有效点比例: 100.00%