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 文件路径。
验证方法与通过标准
运行程序后,按以下步骤确认执行成功:
- 控制台输出:应显示点云点数为 46040 左右,且坐标范围在合理区间(X/Y/Z 均约在 -1.5 到 1.5 之间)。若输出“点云读取失败”,说明文件路径错误。
- 可视化窗口:弹出 3D 窗口,显示一个室内场景的彩色点云(若原始文件无颜色,则显示灰色点云)。可通过鼠标左键旋转视角、滚轮缩放、右键平移。
- 有效点比例:输出应为 100.00%,表示所有点均为有限数值,无 NaN 或无穷值。
- 程序退出:关闭可视化窗口后,程序自动结束,无报错信息。
常见问题
- 读取失败:检查文件路径是否正确,或改用
o3d.io.read_point_cloud("你的路径/fragment.pcd")路径。 - 窗口不显示:在远程服务器或无图形界面环境下,需配置 X11 转发或改用
headless渲染模式(本案例不涉及)。 - 颜色缺失:若点云文件本身不含 RGB 信息,
has_colors()返回False,可视化时点云显示为灰色,属正常现象。