2、Open3D入门:从零开始玩转点云
说实话,我第一次接触Open3D的时候,心里还挺没底的。那时候项目赶得急,客户要一个点云可视化工具,我翻遍了各种库,最后锁定了Open3D。为什么选它?说白了就三个字:轻、快、稳。今天我就带你从安装开始,一步步把Open3D摸透。
2.1 Open3D是什么?
Open3D是一个开源的点云和3D数据处理库。它支持Python和C++,底层用C++优化过,跑起来很快。我个人习惯用Python版本,调试方便,写原型快。
它主要能干这些事:
- 读取和保存各种点云格式(PLY、PCD、XYZ等)
- 点云可视化(旋转、缩放、选点)
- 点云滤波、配准、分割
- 表面重建、法向量估计
嗯,这里要注意:Open3D不是万能的。它擅长处理中小规模的点云(百万级),如果你手上有上亿个点,建议先做下采样。
2.2 安装Open3D
安装其实很简单,一行命令搞定:
pip install open3d
如果你用的是conda环境,也可以:
conda install -c open3d-admin open3d
我曾经在Windows上装过一次,遇到个坑——Python版本不兼容。Open3D 0.15以上版本要求Python 3.7+,建议直接用Python 3.8或3.9,稳得很。
python -c "import open3d as o3d; print(o3d.__version__)",如果输出版本号,说明装成功了。
2.3 读取与保存点云文件
点云文件格式很多,但Open3D统一用 o3d.io.read_point_cloud() 和 o3d.io.write_point_cloud() 来处理。它会根据文件后缀自动识别格式。
来看个例子:
import open3d as o3d
# 读取点云
pcd = o3d.io.read_point_cloud("example.ply")
print(f"点云包含 {len(pcd.points)} 个点")
# 保存点云
o3d.io.write_point_cloud("output.pcd", pcd)
你想想看,就这么几行代码,点云就读进来了。我在项目中经常用PLY格式,因为它能同时存颜色和法向量,省事。
len(pcd.points) 是否大于0。
2.4 点云的基本属性
点云说白了就是一堆三维点的集合。每个点可以带一些属性,最常用的有三个:坐标、颜色、法向量。
2.4.1 点坐标(Points)
坐标是点云的核心,每个点用 (x, y, z) 表示。Open3D里存在 pcd.points 中,类型是 numpy.ndarray。
import numpy as np
# 获取所有点的坐标
points = np.asarray(pcd.points)
print(f"第一个点坐标: {points[0]}")
# 手动创建点云
points = np.array([[0, 0, 0],
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]], dtype=np.float64)
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
这里有个细节:Open3D内部用 Vector3dVector 来存数据,但你可以直接用numpy数组操作,它会自动转换。
2.4.2 颜色(Colors)
颜色属性存在 pcd.colors 中,取值范围是 [0, 1] 的浮点数,顺序是 (R, G, B)。
# 给点云上色(全部设为红色)
colors = np.array([[1, 0, 0]] * len(pcd.points), dtype=np.float64)
pcd.colors = o3d.utility.Vector3dVector(colors)
# 或者从文件读取时自带颜色
pcd = o3d.io.read_point_cloud("colored.ply")
print(f"第一个点颜色: {np.asarray(pcd.colors)[0]}")
我记得有一次做项目,客户要求点云按高度着色。我直接用 z 坐标映射到颜色值,效果还不错。
2.4.3 法向量(Normals)
法向量表示每个点所在表面的朝向。它对于点云渲染和后续处理(比如曲面重建)很重要。
# 估计法向量
pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(
radius=0.1, max_nn=30))
# 获取法向量
normals = np.asarray(pcd.normals)
print(f"第一个点法向量: {normals[0]}")
为什么会需要法向量?你想想看,如果没有法向量,点云渲染出来就是一堆散点,看不出表面形状。有了法向量,才能做光照渲染,看起来像立体模型。
radius=0.05 试,效果不好再调。
2.5 知识体系总览
下面这张图帮你理清本章的知识结构:
2.6 快速可视化
学完读写和属性,当然要看看效果。Open3D的可视化就一行代码:
o3d.visualization.draw_geometries([pcd])
它会弹出一个窗口,你可以用鼠标旋转、滚轮缩放。按 H 键还能看快捷键帮助。我在调试时经常用这个功能,一眼就能看出点云有没有问题。
pcd.points 是不是空的。我曾经犯过一个低级错误——忘了给点云赋值,结果看了半天黑屏。
好了,Open3D的入门就到这里。你学会了安装、读写文件、操作点云属性,还知道了怎么快速可视化。这些是后续所有高级功能的基础,一定要亲手敲一遍代码。
公众号:蓝海资料掘金营,微信deep3321