如果你只是想简单的显示一幅点云,那么CloudViewer会是一个不错的选择。
注意CloudViewer类不能用在多线程
#include
pcl::PointCloud::Ptr cloud;
//... populate cloud
pcl::visualization::CloudViewer viewer ("Simple Cloud Viewer");
viewer.showCloud (cloud);
while (!viewer.wasStopped ())
{
}
PCLVisualizer类包含了PCL用于可视化的所有功能。虽然比CloudViewer使用起来更加困难,但是功能也更加强大,比如显示法线,绘制三维图形,多窗口视图等。
我们先从最基本的功能–显示一个点云开始我们的教程:
pcl::visualization::PCLVisualizer viewer("viewer_1");
viewer_1为显示窗口标题栏上的名称。
viewer.addPointCloud(cloudIn.makeShared(), "cloud1");
因为在窗口中我们可以依次载入多个不同的点云,为了以后分别对这些点云进行操作,我们在载入点云的时候给它一个唯一的ID标识符,比如这里的“cloud1”。
// 循环显示
viewer.spin();
至此,我们可以简单的显示一个点云了,但是为了在可视化窗口显示出更多的信息,对点云进行更多的操作,我们还要进一步探索
// 给点云附上颜色
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloudIn.makeShared(), 255, 0, 0);
// 载入一个点云
viewer.addPointCloud(cloudIn.makeShared(),single_color, "cloud1");
PCL中的渲染属性分为以下几种
enum RenderingProperties
{
PCL_VISUALIZER_POINT_SIZE, 点的大小
PCL_VISUALIZER_OPACITY, 透明度
PCL_VISUALIZER_LINE_WIDTH, 线宽
PCL_VISUALIZER_FONT_SIZE, 字体大小
PCL_VISUALIZER_COLOR, 颜色
PCL_VISUALIZER_REPRESENTATION,
PCL_VISUALIZER_IMMEDIATE_RENDERING,
PCL_VISUALIZER_SHADING
};
设置某一个渲染属性:
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2,"cloud1");
注意,参数里面要选择一个点云ID,表明是对哪个点云进行属性修改
可视化窗口为我们模拟了人的眼睛,这个“眼睛”又是可以通过设置改变其参数的,我们通过设置不同的参数,在这个窗口中可以有不一样的感受。
PCL自带了许多简单的3D图形,比如3D文字,直线,平面,球,圆锥,坐标轴等。这可以被用来显示点云处理后的结果,比如,我们可以画出一个透明的球体,然后看下点云中哪些点应该属于这个球。
这里就只举一个直线的例子,其他都大同小易:
// 添加直线
viewer.addLine(pcl::PointXYZ(0, 0, 0), pcl::PointXYZ(1, 1, 1));
// 设置背景
viewer.setBackgroundColor(0, 1, 0);
// 初始化相机参数
viewer.initCameraParameters();
// 获取相机列表
std::vector camera;
viewer.getCameras(camera);
// 设置相机FOV
viewer.setCameraFieldOfView(0.785398); // fov 大概45度
viewer.setCameraPosition(
0, 0, 5, // camera位置
0, 0, 4, // view向量--相机朝向
0, 1, 5 // up向量
);
viewer.setCameraParameters(camera[0]);
// 多窗口
int v1 = 0;
viewer.createViewPort(0.0, 0.0, 0.5, 1.0, v1);
int v2 = 1;
viewer.createViewPort(0.5, 0.0, 1.0, 1.0, v2);
事件函数
void keyboardEventOccurred(const pcl::visualization::KeyboardEvent &event,
void* viewer_void)
{
pcl::visualization::PCLVisualizer *viewer = static_cast (viewer_void);
if (event.getKeySym() == "r" && event.keyDown())
{
std::cout << "r was pressed => removing all text" << std::endl;
char str[512];
for (unsigned int i = 0; i < text_id; ++i)
{
sprintf(str, "text#%03d", i);
viewer->removeShape(str);
}
text_id = 0;
}
}
注册事件
// 交互
viewer.registerKeyboardCallback(keyboardEventOccurred);