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格式,因为它能同时存颜色和法向量,省事。

注意:读取文件时如果路径不对,Open3D不会报错,而是返回一个空点云。我曾经因为这个bug排查了半天……建议读取后检查 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 知识体系总览

下面这张图帮你理清本章的知识结构:

Open3D入门 安装配置 文件读写 基本属性 pip安装 conda安装 版本检查 read_point_cloud write_point_cloud 格式支持 点坐标 颜色 法向量 掌握这些,点云基础操作就没问题了

2.6 快速可视化

学完读写和属性,当然要看看效果。Open3D的可视化就一行代码:

o3d.visualization.draw_geometries([pcd])

它会弹出一个窗口,你可以用鼠标旋转、滚轮缩放。按 H 键还能看快捷键帮助。我在调试时经常用这个功能,一眼就能看出点云有没有问题。

调试技巧:如果点云显示不出来,先检查 pcd.points 是不是空的。我曾经犯过一个低级错误——忘了给点云赋值,结果看了半天黑屏。

好了,Open3D的入门就到这里。你学会了安装、读写文件、操作点云属性,还知道了怎么快速可视化。这些是后续所有高级功能的基础,一定要亲手敲一遍代码。


公众号:蓝海资料掘金营,微信deep3321