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()
注意 left 和 top 参数,它们控制窗口在屏幕上的位置。我习惯把两个窗口并排摆放,左边一个右边一个,这样对比起来很方便。
3.5 知识体系总览
为了让你更直观地理解本章的知识结构,我画了一张图:
3.6 实战经验总结
最后,分享几个我在实际项目中积累的经验:
- 窗口位置要记好:多窗口时,用
left和top参数固定位置。否则每次打开窗口都叠在一起,还得手动拖开,很烦人。 - 点大小不是越大越好:点云密集时,点太大反而看不清结构。我一般先设 2.0,然后根据视觉效果微调。
- 背景色用深灰:纯黑背景虽然酷,但看久了眼睛累。深灰色 [0.15, 0.15, 0.15] 是我最常用的。
- 调试时用随机点云:别每次都去读文件。生成 1000 个随机点,测试可视化功能,效率高得多。
嗯,这一章的内容就到这里。你学会了如何用 Open3D 创建点云、设置窗口属性、以及同时打开多个窗口进行对比。这些是点云可视化的基本功,后面的章节我们会在这个基础上,加入更高级的功能,比如交互式标注、动画播放等。