PCLVisualizer可视化类是PCL中功能最全的可视化类,与CloudViewer可视化类相比,PCLVisualizer使用起来更为复杂,但该类具有更全面的功能,如显示法线、绘制多种形状和多个视口。本小节将通过示例代码演示PCLVisualizer可视化类的功能,从显示单个点云开始。大多数示例代码都是用于创建点云并可视化其某些特征。

代码

首先,在PCL(Point Cloud Learning)中国协助发行的书提供光盘的第7章例3文件夹中,打开名为pcl_visualizer_demo.cpp的代码文件。

编译并运行程序

利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件,生成执行文件后,就可以运行了,在cmd中键入命令:

...>pcl_visualizer_demo.exe -h

上面命令可以在标准输出设备上打印出帮助信息,提示用户测试哪种可视化试验,通过改变选项改变所运行的不同可视化特征实例,如果需要更详细的细节信息,命令为打印帮助文档,按q键,退出视窗应用程序,按r键,居中并缩放以可见整个点云,使用鼠标,通过点击和拖动旋转视窗,使用鼠标滚轮,或右键单击并上下拖动,实现放大和缩小,滚轮点击或拖动,将会移动视窗。

可视化单个点云

该示例应用PCLVisualizer可视化类显示单个具有XYZ信息的点云,如图1所示,该程序也实现了改变背景颜色和显示坐标轴的功能,代码在simpleVis函数中。

图1可视化单个点云示例

simpleVis函数实现最基本的点云可视化操作,下面我们逐行解析该程序。

boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));

创建视窗对象,并给标题栏定义一个名称"3D Viewer",我们将它定义为boost::shared_ptr智能共享指针,这样可以保证该指针在整个程序全局使用,而不引起内存错误,通常情况下,用户不需要这样做。

viewer->setBackgroundColor (, , );

视窗的背景色可以设为用户喜欢的任意RGB颜色,本例中,我们将它设置为黑色。

viewer->addPointCloud<pcl::PointXYZ> (cloud, "sample cloud");

这是最重要的一行,我们将点云添加到视窗对象中,并定义一个唯一的字符串作为ID号,利用此字符串保证在其他成员方法中也能标识引用该点云,多次调用addPointCloud(),可以实现多个点云的添加,每调用一次就创建一个新的ID号,如果想更新一个已经显示的点云,用户必须先调用removePointCloud(),并提供需要更新的点云的ID号。(注:PCL 的1.1及以上版本提供一个新的API,updatePointCloud(),通过该接口,不必手动调用removePointCloud(),就可实现点云的更新)。这是addPointCloud()函数诸多重载函数中最基本的一种,其他类型的函数用于处理不同类型的点云、显示法线等。在本教程中,我们会讲解其他函数,或者用户也可通过PCLVisualizer API手册查看更详细的说明。

viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, , "sample cloud");

下面的命令行用于改变显示点云的尺寸。用户可以利用该方法控制点云在视窗中的显示方式。

viewer->addCoordinateSystem (1.0);

查看复杂的点云经常会让用户感到没方向感,为了让用户保持正确的坐标判断,需要显示坐标系统方向,可以通过使用X (红色)、Y (绿色) 、Z (蓝色)圆柱体代表坐标轴的显示方式来解决,圆柱体的大小通过scale参数控制。本例中,我们将scale参数设置为1.0,该值也为缺省值,该方法的另一重载函数可实现对点云中的每个点的坐标方向进行显示。

viewer->initCameraParameters ();

最后的调用通过设置相机参数使用户从默认的角度和方向观察点云。

对于所有示例来说,还有一段最后的代码,都在每个示例的末尾:

while (!viewer->wasStopped ())
{
viewer->spinOnce ();
boost::this_thread::sleep (boost::posix_time::microseconds ());
}

上面几行代码在执行一个while循环,每次调用spinOnce都给视窗处理事件的时间,这样允许鼠标键盘等交互操作,此外还有一种spin的重载方法,它只需调用一次。

PCLVisualizer可视化类(1)的更多相关文章

  1. PCLVisualizer可视化类

    PCLVisualizer可视化类 转载自 http://www.cnblogs.com/li-yao7758258/p/6445127.html 如有疑问,请转至该网址留言询问 PCLVisuali ...

  2. PCLVisualizer可视化类(4)

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=168 多视口显示 所示,并进行比较分析,利用不同的搜索半径,基于同一点云计算 ...

  3. PCLVisualizer可视化类(3)

    viewer->addLine<pcl::PointXYZRGB> (cloud->points[0], cloud->points[cloud->size() - ...

  4. PCLVisualizer可视化类(2)

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=163 可视化点云颜色特征 所示,点赋予不同的颜色表征其对应的z轴值不同.PC ...

  5. PCLVisualizer可视化类(5)

    博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=171 自定义交互 多数情况下,默认的鼠标和键盘交互设置不能满足用户的需求,用 ...

  6. 基于PCL绘制模型并渲染

    博客转载自:https://blog.csdn.net/wokaowokaowokao12345/article/details/51321988 前言 抛开算法层面不谈,要利用PCL库中PCLVis ...

  7. PCL可视化显示 直接加载显示pcb文件

    简单可视化类,是指直接在程序中使用,而且不支持多线程. #include<iostream> #include<pcl\point_cloud.h> #include<p ...

  8. [翻译] FastReport Class Hierarchy (FastReport 组件类层次结构)

    "TfrxComponent" is the base class for all FastReport components. Objects of this type have ...

  9. 数据可视化:绘图库-Matplotlib

    为什么要绘图? 一个图表数据的直观分析,下面先看一组北京和上海上午十一点到十二点的气温变化数据: 数据: 这里我用一段代码生成北京和上海的一个小时内每分钟的温度如下: import random co ...

随机推荐

  1. Data Structure Binary Tree: Morris traversal for Preorder

    http://www.geeksforgeeks.org/morris-traversal-for-preorder/ #include <iostream> #include <v ...

  2. zabbix实现mysql数据库的监控(四)

    前面介绍的内容都是用第三方开发好的插件进行mysql监控的,可能有些我们关心的监控内容并不在其中,这时一种常用的方法就是定义我们自己的脚本并将它整合到zabbix中,从而在原有监控的基础上进行有力的补 ...

  3. web框架详解之 tornado 四 模板引擎、session、验证码、xss

    一.模板引擎 基本使用 继承,extends 页面整体布局用继承 导入,include 如果是小组件等重复的那么就用导入 下面是目录 首先在controllers里面创建一个文件,文件里面是页面类 # ...

  4. zTree获取(子)节点

    var ids=[]; ids=getChildren(ids, treeNode);//TreeNode是选中节点,ids是子节点id数组,格式:123,223,4,55 1.获取直接子节点的id ...

  5. JS中的forEach、$.each、map方法推荐

    下面小编就为大家带来一篇JS中的forEach.$.each.map方法推荐.小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 orEach是ECMA5中Array新方法中最 ...

  6. jQuery购物数量数字加减运算效果

    <a href="###" id="add" value="+">+</a> <input type=&quo ...

  7. java支付宝开发-异常-01-"sub_code":"isv.invalid-app-id","sub_msg":"无效的AppID参数"

    一.现象 无论请求哪个接口都报这个错误 二.异常原因 后来检查了一下,发现是因为 我支付宝网关写错了.沙箱环境和正式环境 的支付宝网关不同,如下 //支付宝网关名-正式环境 //public stat ...

  8. HDU - 5934

    tarjan 视频讲解 /** * 题目链接:https://vjudge.net/problem/HDU-5934 * 题意:给你n个炸弹,引爆每个炸弹会有一定的花费.每个炸弹给出坐标x,y,半径r ...

  9. 一个类的类类型是Class类的实例,即类的字节码

    new 是静态加载类,编译时期加载.一遍功能性的类 需要动态加载

  10. JAVA堆内存和栈内存初步了解

    一.堆内存和栈内存 程序运行时内存分配有三种:静态存储分配,栈式存储分配,堆式存储分配 1.静态存储分配: 在程序编译时就可以确定数据目标在运行时所需要的内存,因此在编译时就为其分配固定大小的内存. ...