PCLVisualizer 示例
PCLVisualizer 是 PCL 的可视化类,提供了显示法线、绘制形状和多个视口等功能
这里记录一些 PCLVisualizer 类的使用
完整的示例代码可以在官方文档查看
Visualising a single cloud
在示例中的函数 pcl::visualization::PCLVisualizer::Ptr simpleVis () 定义了可视化单个 PointXYZ Cloud 的方法
simpleVis
pcl::visualization::PCLVisualizer::Ptr simpleVis (pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
{
// --------------------------------------------
// -----Open 3D viewer and add point cloud-----
// --------------------------------------------
pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
viewer->setBackgroundColor (0, 0, 0);
viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
viewer->addCoordinateSystem (1.0);
viewer->initCameraParameters ();
return (viewer);
}
注释
pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
- 创建对象查看器
PCLVisualizer,并存入智能指针
viewer->setBackgroundColor (0, 0, 0);
- 设置查看器的背景为黑色
viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");
- 将点云添加到查看器,并为点云提供一个
ID字符串,该ID可用于其他方法识别云- 可以通过多次调用
addPointCloud()添加多个点云,如果要更新已经显示的点云,则需要调用updatePointCloud() - PCL 1.1 版本之前需要先调用
removePointCloud()并提供要更新的点云ID
- 可以通过多次调用
viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
- 更改渲染属性,此方法可以控制查看器中渲染任何点云的方式
- 这里
PCL_VISUALIZER_POINT_SIZE表示设置渲染点的大小,具体属性可以在pcl::visualization::RenderingProperties这个枚举中查看
- 这里
viewer->addCoordinateSystem (1.0);
- 添加坐标系,
X(R) Y(G) Z(B),可以通过scale参数控制坐标轴的大小,默认为1.0
viewer->initCameraParameters ();
- 设置一些比较方便的相机参数
while (!viewer->wasStopped ())
{
viewer->spinOnce (100);
std::this_thread::sleep_for(100ms);
}
运行循环,每次调用
spinOnce都会给观看者时间来处理事件,使其具有交互性运行结果

RGB point clouds
函数 pcl::visualization::PCLVisualizer::Ptr rgbVis() 中定义了此方法如何实现
大部分代码没有多大变化
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
- 更改了点的类型,使用了为
RGB数据提供空间的PointXYZRGB
viewer->addPointCloud<pcl::PointXYZRGB> (cloud, rgb, "sample cloud");
添加点云时,指定了颜色处理参数
运行结果

Custom colours
rgbVis() 中为点云提供单一颜色,可以为特定的点云提供自定义的颜色,从而能区分单个点云
示例函数为 pcl::visualization::PCLVisualizer::Ptr customColourVis()
大部分代码也没有什么变化
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);
设置点云类型时指定了颜色
运行结果

Normals and other information
函数pcl::visualization::PCLVisualizer::Ptr normalsVis() 中展示了如何显示点云的法线
viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal> (cloud, normals, 10, 0.05, "normals");
其他代码可参照
rgbVis(),然后绘制了法线- 关于绘制法线实现的讲解 Estimating Surface Normals in a PointCloud
运行结果

Drawing Shapes
函数 pcl::visualization::PCLVisualizer::Ptr shapesVis() 定义了向查看器添加形状的方法
viewer->addLine<pcl::PointXYZRGB> ((*cloud)[0], (*cloud)[cloud->size() - 1], "line");
- 绘制直线
viewer->addSphere ((*cloud)[0], 0.2, 0.5, 0.5, 0.0, "sphere");
- 绘制圆
pcl::ModelCoefficients coeffs;
coeffs.values.push_back (0.0);
coeffs.values.push_back (0.0);
coeffs.values.push_back (1.0);
coeffs.values.push_back (0.0);
viewer->addPlane (coeffs, "plane");
- 绘制平面
coeffs.values.clear ();
coeffs.values.push_back (0.3);
coeffs.values.push_back (0.3);
coeffs.values.push_back (0.0);
coeffs.values.push_back (0.0);
coeffs.values.push_back (1.0);
coeffs.values.push_back (0.0);
coeffs.values.push_back (5.0);
viewer->addCone (coeffs, "cone");
绘制圆锥
运行结果

Multiple viewports
函数 pcl::visualization::PCLVisualizer::Ptr viewportsVis() 演示了在单独的窗口中绘制多个点云
- 运行结果
