(十三)Visualization教程一

CloudViewer

如果你只是想简单的显示一幅点云,那么CloudViewer会是一个不错的选择。

注意CloudViewer类不能用在多线程

实例

头文件

#include <pcl/visualization/cloud_viewer.h>

程序

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
//... populate cloud
pcl::visualization::CloudViewer viewer ("Simple Cloud Viewer");
viewer.showCloud (cloud);
while (!viewer.wasStopped ())
{
}

PCLVisualizer

PCLVisualizer类包含了PCL用于可视化的所有功能。虽然比CloudViewer使用起来更加困难,但是功能也更加强大,比如显示法线,绘制三维图形,多窗口视图等。
我们先从最基本的功能–显示一个点云开始我们的教程:

一、显示点云

步骤

  1. 初始化PCLVisualizer
pcl::visualization::PCLVisualizer viewer("viewer_1");

viewer_1为显示窗口标题栏上的名称。

  1. 向PCLVisualizer载入点云
viewer.addPointCloud(cloudIn.makeShared(), "cloud1");

因为在窗口中我们可以依次载入多个不同的点云,为了以后分别对这些点云进行操作,我们在载入点云的时候给它一个唯一的ID标识符,比如这里的“cloud1”。

  1. 循环显示
// 循环显示
viewer.spin();

至此,我们可以简单的显示一个点云了,但是为了在可视化窗口显示出更多的信息,对点云进行更多的操作,我们还要进一步探索

二、修改可视化的渲染属性

给点云附上颜色

  1. 初始化一个PointCloudColorHandlerCustom类,初始化参数分别是:要上颜色的点云,r,g,b。
// 给点云附上颜色
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloudIn.makeShared(), 255, 0, 0);
  1. 载入点云时,以参数的将初始化了的PointCloudColorHandlerCustom类带入
// 载入一个点云
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,表明是对哪个点云进行属性修改

三、设置参数

可视化窗口为我们模拟了人的眼睛,这个“眼睛”又是可以通过设置改变其参数的,我们通过设置不同的参数,在这个窗口中可以有不一样的感受。

添加3D图形

PCL自带了许多简单的3D图形,比如3D文字,直线,平面,球,圆锥,坐标轴等。这可以被用来显示点云处理后的结果,比如,我们可以画出一个透明的球体,然后看下点云中哪些点应该属于这个球。
这里就只举一个直线的例子,其他都大同小易:

// 添加直线
viewer.addLine(pcl::PointXYZ(0, 0, 0), pcl::PointXYZ(1, 1, 1));

设置背景颜色

// 设置背景
viewer.setBackgroundColor(0, 1, 0);

设置相机参数

初始化相机参数

// 初始化相机参数
viewer.initCameraParameters();

获取相机列表

// 获取相机列表
std::vector<pcl::visualization::Camera> camera;
viewer.getCameras(camera);

设置相机FOV

// 设置相机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<pcl::visualization::PCLVisualizer *> (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);

运行结果

猜你喜欢

转载自blog.csdn.net/jiaojialulu/article/details/69352738