2. 点云可视化:PCL可视化工具、Open3D可视化基础、点云颜色与渲染
点云可视化,说白了就是让那些密密麻麻的坐标点「开口说话」。你想想看,一堆 xyz 数字摆在那,谁也看不出门道。但一旦渲染成图像,哪里是地面、哪里是障碍物、哪里是墙面,一目了然。
我个人习惯,拿到点云数据的第一件事就是可视化。不是急着做滤波、分割,而是先看看数据长什么样。这就像医生看片子,总得先扫一眼全局,再去做局部诊断。
2.1 PCL 可视化工具:老牌劲旅
PCL(Point Cloud Library)的可视化模块,我用了快十年了。它最大的优点是稳定、功能全。我在项目中遇到过不少次,点云数据量特别大,Open3D 直接卡死,但 PCL 的 CloudViewer 还能撑住。
PCL 提供了两种可视化方式:
- CloudViewer:轻量级,适合快速查看
- PCLVisualizer:功能完整,支持交互、多窗口、自定义渲染
先看一个最简单的例子:
// C++ 示例:PCL CloudViewer 基本用法
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/pcd_io.h>
int main() {
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("example.pcd", *cloud);
pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");
viewer.showCloud(cloud);
while (!viewer.wasStopped()) {
// 保持窗口打开
}
return 0;
}
嗯,这里要注意:CloudViewer 是阻塞式的,它会一直运行直到你关闭窗口。如果你需要在可视化过程中做其他操作,建议用 PCLVisualizer。
2.2 Open3D 可视化基础:后起之秀
Open3D 是后来才火起来的。说实话,我第一次用 Open3D 时还有点抵触,觉得 PCL 够用了。但用了一段时间后,我承认——Open3D 在 Python 生态下确实香。
它的 API 设计更现代,代码更简洁。同样的功能,PCL 可能要写 20 行,Open3D 5 行搞定。
# Python 示例:Open3D 基本可视化
import open3d as o3d
import numpy as np
# 生成随机点云
points = np.random.rand(1000, 3)
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
# 可视化
o3d.visualization.draw_geometries([pcd])
你看,就这么几行。Open3D 的 draw_geometries 函数会自动处理窗口、视角、光照。我曾经在项目里用它做快速原型验证,一天能迭代十几个版本。
2.3 点云颜色与渲染:让数据「活」起来
点云默认是灰色的,看起来像一堆铅球。但加上颜色后,信息量瞬间翻倍。颜色可以来自:
- RGB 信息:如果传感器支持彩色(如 RealSense、Kinect),直接映射
- 高度映射:根据 z 值着色,常用于地形分析
- 强度映射:激光雷达返回的反射强度,可用于区分材质
- 分类标签:不同类别用不同颜色,语义分割的标配
我个人最常用的是高度映射。为什么呢?因为地面通常是平的,高度一着色,哪里是坑、哪里是坡,一眼就能看出来。我曾经在户外场景中,用高度映射快速定位了一个排水沟的位置,省了半小时的测量时间。
Open3D 中给点云上色很简单:
# 高度映射着色
import open3d as o3d
import numpy as np
pcd = o3d.io.read_point_cloud("terrain.pcd")
points = np.asarray(pcd.points)
# 根据 z 值计算颜色
z = points[:, 2]
z_min, z_max = z.min(), z.max()
colors = (z - z_min) / (z_max - z_min) # 归一化到 [0, 1]
colors = np.stack([colors, colors, colors], axis=1) # 灰度
# 或者用彩虹色
import matplotlib.cm as cm
colors = cm.jet((z - z_min) / (z_max - z_min))[:, :3] # RGB
pcd.colors = o3d.utility.Vector3dVector(colors)
o3d.visualization.draw_geometries([pcd])
2.4 渲染参数调优
渲染不是「能看见就行」,好的渲染能帮你发现数据中的细微特征。我常用的几个参数:
| 参数 | 说明 | 我的推荐值 |
|---|---|---|
| 点大小 | 点云中每个点的像素大小 | 2-5(稀疏场景用大点) |
| 背景色 | 窗口背景颜色 | 深灰或黑色(对比度高) |
| 光照 | 是否启用光照效果 | 关闭(点云不需要光照) |
| 坐标轴 | 显示坐标系 | 开启(方便定位) |
Open3D 中调整这些参数:
# 渲染参数设置
vis = o3d.visualization.Visualizer()
vis.create_window()
# 添加点云
vis.add_geometry(pcd)
# 获取渲染选项
opt = vis.get_render_option()
opt.point_size = 3.0
opt.background_color = np.array([0.1, 0.1, 0.1]) # 深灰
opt.light_on = False # 关闭光照
# 获取视角控制
ctrl = vis.get_view_control()
ctrl.set_zoom(0.8)
vis.run()
vis.destroy_window()
2.5 本章知识体系
下面这张图,是我自己梳理的点云可视化知识结构。你可以把它当作一个「可视化检查清单」:
这张图把本章内容分成了三大块。左边是 PCL,右边是 Open3D,中间是颜色与渲染。你从哪块开始学都行,但我建议先掌握 Open3D 的基础可视化,因为它上手快、反馈及时。等需要做高性能或嵌入式部署时,再回头啃 PCL。
好了,关于可视化就聊这么多。记住一句话:好的可视化,能让你少走一半弯路。