(十三)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);

运行结果

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt Data Visualization是一个用于可视化数据的Qt模块。您可以使用它创建各种类型的图表,如柱状图、曲面图和散点图。下面是一些关于使用Qt Data Visualization的示例代码: 对于柱状图,您可以使用QBar3DSeries类和QBarDataRow类来创建和管理数据。首先,构造一个Q3DBars实例,并设置坐标轴的显示范围。然后,创建一个QBar3DSeries实例,并使用QBarDataRow添加行数据。最后,将该系列添加到图形中,并显示出来。 对于曲面图,您可以使用QSurface3DSeries类和QSurfaceDataRow类来创建和管理数据。首先,构造一个Q3DSurface实例,并设置坐标轴的显示范围。然后,创建一个QSurfaceDataArray实例,并使用QSurfaceDataRow添加行数据。最后,将该数据数组设置为QSurface3DSeries的数据代理,并将该系列添加到图形中,并显示出来。 对于散点图,您可以使用QScatter3DSeries类和QScatterDataArray类来创建和管理数据。首先,构造一个Q3DScatter实例,并设置坐标轴的显示范围。然后,创建一个QScatterDataArray实例,并使用QVector3D添加散点数据。最后,将该数据数组设置为QScatter3DSeries的数据代理,并将该系列添加到图形中,并显示出来。 这些示例代码可以帮助您入门Qt Data Visualization,并为您提供创建各种图表的基础知识。您可以根据需要进行修改和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值