3、点云可视化基础:使用Open3D可视化点云,设置窗口属性(背景色、点大小、窗口标题),多窗口可视化。

点云可视化,说白了就是让一堆三维坐标点「活」起来。你想想看,激光雷达扫出来的数据,本质上就是成千上万个 (x, y, z) 坐标,外加一个反射强度值。光看数字,谁也看不出个所以然。但一旦把它们渲染到屏幕上,你就能一眼看出:哦,这是一辆车,那是一棵树,前面有个行人。

我个人习惯,拿到点云数据的第一件事,就是先可视化看一眼。这比任何数据预处理都重要。为什么?因为数据质量好不好,有没有异常点,视野覆盖是否完整,可视化一眼就能看出来。我曾在项目中遇到过,客户说数据采集没问题,结果我一可视化,发现点云全是「飞点」——那些飘在半空中的噪声点。要是直接拿去跑算法,后果可想而知。

3.1 从零开始:Open3D 的安装与导入

Open3D 是目前我用下来最顺手的点云处理库。它不像 PCL 那样配置起来让人头疼,pip 一键安装,开箱即用。

pip install open3d

安装完成后,在 Python 里导入它:

import open3d as o3d
import numpy as np

嗯,这里要注意:Open3D 对 Python 版本有要求,建议用 Python 3.8 以上。我之前在 Python 3.6 上踩过坑,有些新特性不支持,折腾了半天。

3.2 创建并可视化第一个点云

我们先造一个最简单的点云——随机生成 1000 个三维点。别笑,这招在调试时特别有用。你想测试某个可视化功能,又不想每次都去读真实数据文件,自己生成点云是最快的。

# 生成随机点云
points = np.random.rand(1000, 3)  # 1000个点,每个点有x,y,z坐标
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)

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

运行这段代码,你会看到一个窗口弹出来,里面飘着一团彩色的点。默认情况下,Open3D 会根据点的 Z 轴高度(也就是深度)给点上色,从蓝色渐变到红色。这个配色其实挺直观的,离你近的点偏红,远的偏蓝。

小技巧: 如果你想让点云显示为纯色,可以手动设置颜色。比如全部设为白色:pcd.paint_uniform_color([1, 1, 1])。这在做对比展示时很有用。

3.3 设置窗口属性:背景色、点大小、窗口标题

默认的窗口是黑底、小点、标题是「Open3D」。说实话,这个默认配置在演示时不太好看。我习惯把背景改成深灰色,点调大一点,标题改成有意义的名字。

Open3D 提供了 Visualizer 类,可以精细控制窗口的每一个细节。来看代码:

# 创建可视化窗口
vis = o3d.visualization.Visualizer()
vis.create_window(window_name='我的点云数据', width=800, height=600)

# 添加点云
vis.add_geometry(pcd)

# 设置渲染选项
opt = vis.get_render_option()
opt.background_color = np.array([0.1, 0.1, 0.1])  # 深灰色背景
opt.point_size = 3.0  # 点的大小,默认是1.0

# 运行可视化
vis.run()
vis.destroy_window()

这里我解释几个关键点:

  • 背景色:用 RGB 值表示,范围 0~1。深灰色 [0.1, 0.1, 0.1] 比纯黑更护眼,而且能衬托出点云的颜色。
  • 点大小:默认 1.0 在 4K 屏幕上几乎看不见。我一般设到 3.0~5.0,具体看点的密度。点云稀疏就调大,密集就调小。
  • 窗口标题window_name 参数,建议包含数据来源或时间戳,方便多窗口时区分。
避坑指南: 我曾经在循环中反复调用 create_window()destroy_window(),结果内存泄漏了。正确的做法是:如果只是静态展示,用 draw_geometries() 就够了;如果需要交互或动态更新,才用 Visualizer 类,并且记得在结束时调用 destroy_window()

3.4 多窗口可视化:同时看多个点云

实际工作中,我们经常需要对比两个点云。比如:原始数据 vs 滤波后的数据,或者两帧不同时刻的点云。Open3D 支持同时打开多个窗口,每个窗口独立控制。

实现方式很简单:创建多个 Visualizer 实例即可。

# 生成两个不同的点云
pcd1 = o3d.geometry.PointCloud()
pcd1.points = o3d.utility.Vector3dVector(np.random.rand(500, 3))
pcd1.paint_uniform_color([1, 0, 0])  # 红色

pcd2 = o3d.geometry.PointCloud()
pcd2.points = o3d.utility.Vector3dVector(np.random.rand(500, 3) + 0.5)  # 偏移一点
pcd2.paint_uniform_color([0, 0, 1])  # 蓝色

# 创建窗口1
vis1 = o3d.visualization.Visualizer()
vis1.create_window(window_name='点云A', width=600, height=500, left=50, top=50)
vis1.add_geometry(pcd1)
opt1 = vis1.get_render_option()
opt1.background_color = np.array([0.1, 0.1, 0.1])
opt1.point_size = 4.0

# 创建窗口2
vis2 = o3d.visualization.Visualizer()
vis2.create_window(window_name='点云B', width=600, height=500, left=700, top=50)
vis2.add_geometry(pcd2)
opt2 = vis2.get_render_option()
opt2.background_color = np.array([0.2, 0.2, 0.2])  # 稍微不同的背景色
opt2.point_size = 4.0

# 同时运行两个窗口
vis1.run()
vis2.run()

vis1.destroy_window()
vis2.destroy_window()

注意 lefttop 参数,它们控制窗口在屏幕上的位置。我习惯把两个窗口并排摆放,左边一个右边一个,这样对比起来很方便。

核心要点: 多窗口可视化的本质是「多个独立的 Visualizer 实例」。每个实例都有自己的渲染选项、几何体和窗口属性。它们互不干扰,可以独立操作(旋转、缩放、平移)。

3.5 知识体系总览

为了让你更直观地理解本章的知识结构,我画了一张图:

点云可视化基础 - 知识体系 Open3D 可视化 窗口属性设置 背景色 点大小 窗口标题 多窗口可视化 多个 Visualizer 实例 独立控制与对比 渲染选项配置 get_render_option() 点云颜色设置 核心思想:Visualizer 类 + 渲染选项 = 灵活控制 多窗口 = 多个 Visualizer 实例,各自独立

3.6 实战经验总结

最后,分享几个我在实际项目中积累的经验:

  1. 窗口位置要记好:多窗口时,用 lefttop 参数固定位置。否则每次打开窗口都叠在一起,还得手动拖开,很烦人。
  2. 点大小不是越大越好:点云密集时,点太大反而看不清结构。我一般先设 2.0,然后根据视觉效果微调。
  3. 背景色用深灰:纯黑背景虽然酷,但看久了眼睛累。深灰色 [0.15, 0.15, 0.15] 是我最常用的。
  4. 调试时用随机点云:别每次都去读文件。生成 1000 个随机点,测试可视化功能,效率高得多。

嗯,这一章的内容就到这里。你学会了如何用 Open3D 创建点云、设置窗口属性、以及同时打开多个窗口进行对比。这些是点云可视化的基本功,后面的章节我们会在这个基础上,加入更高级的功能,比如交互式标注、动画播放等。


专注资料整理