第1章:Open3D基础:库介绍、安装配置、点云数据读取与可视化、基本数据结构

1.1 为什么选择Open3D?

做三维重建和点云处理,工具链的选择其实挺多的。PCL(Point Cloud Library)是老牌劲旅,功能全面但编译起来能让人怀疑人生。我个人习惯用Open3D,原因很简单——它真的「开箱即用」。

Open3D是一个由Intel Labs开源的现代3D数据处理库。它用C++写了底层,但提供了非常友好的Python接口。说白了,你不需要懂C++,也能用它完成从点云读取、滤波、配准到重建的全流程。

我在项目中遇到过好几次这样的场景:客户给了一个几十GB的激光扫描数据,要求快速预览。用PCL编译个可视化工具得折腾半天,而Open3D三行代码就搞定了。嗯,这就是我选择它的理由。

核心优势:

  • 安装极简:一行 pip install open3d 搞定
  • API设计优雅:链式调用,代码写起来很舒服
  • 可视化强大:内置GUI,支持交互式操作
  • 性能优秀:底层C++,Python接口几乎无性能损失

1.2 安装配置:真的就一行

你可能会觉得我在吹牛,但Open3D的安装确实简单到离谱。

# 基础安装
pip install open3d

# 如果你需要最新特性(比如我经常用到的Tensor支持)
pip install open3d --upgrade

为什么会这么简单?因为Open3D把所有的依赖都打包好了。不像PCL需要你手动安装VTK、Boost、Eigen这些库,Open3D直接给你一个「全家桶」。

我的建议:如果你在Windows上安装,记得用Python 3.8以上版本。我曾经在Python 3.7上踩过坑,有些新特性不支持。

验证安装是否成功,跑一下这段代码:

import open3d as o3d
print(o3d.__version__)

# 如果能正常输出版本号,比如 0.17.0,那就说明安装成功了

注意:如果你在Linux服务器上安装,可能会遇到libGL.so.1缺失的问题。解决方案很简单:

sudo apt-get install libgl1-mesa-glx

1.3 点云数据读取:支持哪些格式?

做三维重建,你免不了要和各种格式的点云文件打交道。Open3D支持的主流格式我都列在下面了:

格式 说明 我的使用频率
.ply 斯坦福三角形格式,带顶点颜色 ⭐⭐⭐⭐⭐
.pcd Point Cloud Library格式 ⭐⭐⭐⭐
.xyz 纯文本,每行 x y z ⭐⭐⭐
.pts 激光雷达常用格式 ⭐⭐
.las/.laz 航空激光雷达标准格式 ⭐(需额外库)

读取代码非常简单:

import open3d as o3d

# 读取PLY文件
pcd = o3d.io.read_point_cloud("bunny.ply")

# 读取PCD文件
pcd = o3d.io.read_point_cloud("scan.pcd")

# 读取XYZ文件
pcd = o3d.io.read_point_cloud("points.xyz", format='xyz')

print(f"点云包含 {len(pcd.points)} 个点")

避坑指南:我曾经在处理一个大型激光雷达数据时,直接读取一个2GB的.pcd文件,结果内存爆了。后来发现Open3D支持流式读取:

# 分块读取,避免内存溢出
pcd = o3d.io.read_point_cloud("large_scan.pcd", 
                               remove_nan_points=True,
                               remove_infinite_points=True)

1.4 可视化:让点云「活」起来

点云处理最爽的一刻,就是看到数据在屏幕上呈现出来。Open3D的可视化做得相当漂亮。

import open3d as o3d

# 读取点云
pcd = o3d.io.read_point_cloud("bunny.ply")

# 最简单的可视化
o3d.visualization.draw_geometries([pcd])

# 带参数的可视化
o3d.visualization.draw_geometries(
    [pcd],
    window_name="我的第一个点云",
    width=800,
    height=600,
    point_show_normal=True,  # 显示法向量
    mesh_show_wireframe=True  # 显示网格线框
)

你想想看,当你运行这段代码,一个三维的斯坦福兔子出现在屏幕上,还能用鼠标拖拽旋转、滚轮缩放——这种感觉真的很棒。

可视化小技巧:

  • 按住左键拖拽:旋转视角
  • 滚轮:缩放
  • 按住右键拖拽:平移
  • 按 K 键:切换背景颜色
  • 按 N 键:切换法向量显示

1.5 基本数据结构:点云、网格、体素

Open3D的核心数据结构就三种,搞懂了它们,后面的学习就顺了。

1.5.1 PointCloud(点云)

这是最常用的数据结构。说白了就是一个点的集合,每个点包含三维坐标,还可以有颜色和法向量。

import open3d as o3d
import numpy as np

# 创建一个空点云
pcd = o3d.geometry.PointCloud()

# 添加点坐标(Nx3的numpy数组)
points = np.array([
    [0, 0, 0],
    [1, 0, 0],
    [0, 1, 0],
    [0, 0, 1]
], dtype=np.float64)
pcd.points = o3d.utility.Vector3dVector(points)

# 添加颜色(Nx3的numpy数组,值范围0-1)
colors = np.array([
    [1, 0, 0],  # 红色
    [0, 1, 0],  # 绿色
    [0, 0, 1],  # 蓝色
    [1, 1, 0]   # 黄色
], dtype=np.float64)
pcd.colors = o3d.utility.Vector3dVector(colors)

# 添加法向量
normals = np.array([
    [0, 0, 1],
    [0, 0, 1],
    [0, 0, 1],
    [0, 0, 1]
], dtype=np.float64)
pcd.normals = o3d.utility.Vector3dVector(normals)

# 可视化
o3d.visualization.draw_geometries([pcd])

我的经验:注意数据类型一定要用float64,否则会报错。我刚开始用的时候经常忘记,后来养成了习惯,创建numpy数组时都加上dtype=np.float64。

1.5.2 TriangleMesh(三角网格)

网格比点云多了一个信息——顶点之间的连接关系。每个三角形由三个顶点索引构成。

# 创建一个立方体网格
mesh = o3d.geometry.TriangleMesh.create_box()

# 或者从点云重建网格
mesh = o3d.geometry.TriangleMesh.create_from_point_cloud_alpha_shape(pcd, alpha=0.1)

# 可视化
o3d.visualization.draw_geometries([mesh])

1.5.3 VoxelGrid(体素网格)

体素就是把三维空间划分成一个个小立方体。这在点云下采样和空间分析中非常有用。

# 从点云创建体素网格
voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, voxel_size=0.05)

# 可视化体素
o3d.visualization.draw_geometries([voxel_grid])

三种数据结构的对比:

数据结构 存储内容 典型应用
PointCloud 点坐标 + 颜色 + 法向量 原始数据存储、滤波、配准
TriangleMesh 顶点 + 三角面片 + 纹理 三维重建、渲染、打印
VoxelGrid 体素占据状态 下采样、碰撞检测、空间划分

1.6 本章小结

嗯,到这里Open3D的基础就讲完了。你学会了安装、读取点云、可视化,还掌握了三种核心数据结构。说实话,这些内容看起来简单,但它们是后续所有高级操作的基础。

我记得刚开始做三维重建项目时,光是搞懂这些数据结构就花了一周时间。现在你半小时就掌握了,效率比我当年高多了。

下一章我们会深入点云滤波和降采样,到时候你会看到这些基础知识的实际应用。准备好了吗?