点云视窗类CloudViewer
博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=149
点云视窗类CloudViewer是简单显示点云的可视化工具类,可以让用户用尽可能少的代码查看点云。注意:点云视窗类不能应用于多线程应用程序中。
简单点云可视化
如果用户想用几行代码可视化程序中所对应的地物,可以使用下面的代码:
#include <pcl/visualization/cloud_viewer.h>
//...
void
foo ()
{
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
//... 为cloud添加对应的场景
pcl::visualization::CloudViewer viewer ("Simple Cloud Viewer");
viewer.showCloud (cloud);
while (!viewer.wasStopped ())
{
}
}
一个更具体的例子
下面是关于如何在可视化线程中运行代码的例子,PCLVisualizer是CloudViewer的后端,但它在自己的线程中运行,若要使用PCLVisualizer类,必须使用调用函数,这样可以避免可视化的并发问题。但是,调用时一定要特别注意,以免发生代码混乱的情况,因为调用函数要从可视化线程中进行。
代码
首先,在PCL(Point Cloud Learning)中国协助发行的书提供光盘的第7章例1文件夹中,打开名为cloud_viewer.cpp的代码文件。同文件夹下可以找到相关的测试点云文件maize.pcd。
解释说明
下面解析源代码的关键语句,下面一段代码为相关类的头文件声明。
#include <pcl/visualization/cloud_viewer.h> //类CloudViewer头文件声明
#include <iostream> //标准输入输出头文件声明
#include <pcl/io/io.h> //io相关头文件声明
#include <pcl/io/pcd_io.h> //pcd文件读取头文件声明
下面函数是作为回调函数,在主函数中注册后只执行一次,函数具体实现对可视化对象背景颜色设置、添加一个圆球几何体。
int user_data;
void
viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{
viewer.setBackgroundColor (1.0, 0.5, 1.0); //设置背景颜色
pcl::PointXYZ o; //存储球的圆心位置
o.x =1.0;
o.y =;
o.z =;
viewer.addSphere (o, 0.25, "sphere", ); //添加圆球几何对象
std::cout <<"i only run once"<< std::endl;
}
下面函数是作为回调函数,在主函数中注册后每帧显示都执行一次,函数具体实现在可视化对象中添加一个刷新显示字符串。
void
viewerPsycho (pcl::visualization::PCLVisualizer& viewer)
{
staticunsigned count =;
std::stringstream ss;
ss<<"Once per viewer loop: "<< count++;
viewer.removeShape ("text", );
viewer.addText (ss.str(), , , "text", );
//FIXME: possible race condition here:
user_data++;
}
下面函数是主函数,首先加载点云文件到点云对象,并初始化可视化对象viewer,注册上面定义的回调函数,执行循环直到收到关闭viewer的消息退出程序。
int
main ()
{
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
pcl::io::loadPCDFile ("maize.pcd", *cloud); //加载点云文件
pcl::visualization::CloudViewer viewer("Cloud Viewer"); //创建viewer对象
//showCloud函数是同步的,在此处等待直到渲染显示为止
viewer.showCloud(cloud)
//该注册函数在可视化时只调用一次
viewer.runOnVisualizationThreadOnce (viewerOneOff);
//该注册函数在渲染输出时每次都调用
viewer.runOnVisualizationThread (viewerPsycho);
while (!viewer.wasStopped ())
{
//在此处可以添加其他处理
user_data++;
}
return0;
}
编译并运行程序
利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件,生成执行文件后,就可以运行了,在cmd中键入命令:
...>cloud_viewer.exe
运行结果如图1所示,可以看到一个圆球、玉米的点云、动态刷新的字符串。
图1 CloudViewer实例运行结果
敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。
参考文献:
1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版社2012-10
点云视窗类CloudViewer的更多相关文章
- 看云-git类的书籍写作
看云-git类的书籍写作 https://www.kancloud.cn/explore 测试一本:https://www.kancloud.cn/stono/b001/501901
- 词云wordcloud类介绍&python制作词云图&词云图乱码问题等小坑
词云图,大家一定见过,大数据时代大家经常见,我们今天就来用python的第三方库wordcloud,来制作一个大数据词云图,同时会降到这个过程中遇到的各种坑, 举个例子,下面是我从自己的微信上抓的微信 ...
- 高榕资本宾悦:未使用的企业家Testin云测试服务类故障
高榕资本岳斌:创业者未使用Testin云測试服务属不合格 2014/10/09 · Testin · 开发人员訪谈 Testin云測与工信部等联合承办的ICT中国.2014高层论坛之移动开发人员分论坛 ...
- 百度地图LBS云平台读写数据操作类
最近写了个叫<行踪记录仪>的手机软件,用了百度云来记录每个用户的最近位置,以便各用户能在地图上找到附近的人,为此写了个类来读写数据,大致如下: import java.util.Array ...
- PCL:PCL可视化显示点云
(1):引用:仅仅是简单的显示点云,可以使用CloudViewer类.这个类非常简单易用.但要注意,它不是线程安全的.如果要用于多线程,还要参考PCLVisualizer. 需要注意的是,PointC ...
- 坚果云创业团队访谈:我们 DIY 云存储(不要过度关注竞争对手,尤其当我们还是小公司的时候)
坚果云(http://jianguoyun.com/)是一款用于多平台文件同步.备份和交换的云存储工具,立志于提供“便捷,安全”的服务.坚果云自去年年初启动内测,至今年三月初刚刚正式发布.近日我们拜访 ...
- Java使用百度云存储BCS-让你的数据下载飞起来
作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.简介 云也不是一个新概念了,云到底是什么东西,你叫我说个明明白白的我也说不出来,姑且算作联网的就叫做云.国内的云服 ...
- MFC自创建类了解
CxxxxView 视窗类 所有的按键 等消息都先在这里响应 CxxxxDoc 文档类 CMainFrame 框架类 CxxxxApp 应用程序类 CxxxxView类中的 OnDraw函数 在窗口改 ...
- Web开发者的10个最好的云开发环境
1. Cloud9 IDE cloud9 Cloud9是我最喜欢的一个最好的云开发环境,它可以让我在任何时间任何地点进行代码编写.运行和调试.Cloud9对Node.js 和 JavaScript代码 ...
随机推荐
- Java实现将一段汉字变成unicode码
public class T { public static void main(String[] args) { String s = "java 中文编码"; System.o ...
- mac manpages 汉化
默认在终端进行man命令,如:man ls,会显示英文的帮助文档.本文教你如何查看中文文档. 资源:1.manpages-zh-1.5.2.tar.bz22.groff-1.21.tar.gz - ...
- OSI模型网络分层
OSI TCP/IP --- ------- 应用层 表示层 应用层 会话层 ----- ------- 传输层 TCP UDP ----- ------- 网络层 IPv4/IPv6 ----- - ...
- Vim 的命令模式转插入模式
一.在命令模式输入下面的快捷方式: i 在当前光标前插入字符: I 在当前行行首插入字符: a 在当前光标后插入字符: A 在当前行行尾插入字符: o 在当前行下面另起一新行: O 在当前行上面另起一 ...
- <Linux内核源码>内存管理模型
题外语:本人对linux内核的了解尚浅,如果有差池欢迎指正,也欢迎提问交流! 首先要理解一下每一个进程是如何维护自己独立的寻址空间的,我的电脑里呢是8G内存空间.了解过的朋友应该都知道这是虚拟内存技术 ...
- mysql日志总结
1.mysql慢查询设置 log-slow-queries=/alidata/mysql-log/mysql-slow.loglong_query_time = 1log-queries-not-us ...
- Spring Cloud之Feigin客户端重构思想
应该重构接口信息(重点) toov5-parent 存放共同依赖信息 toov5-api api的只有接口没有实现 toov5-api-member toov5-api-order to ...
- django admin扩展user表password验证及set_password
一般如果扩展了django user内置表,在admin后台创建新用户的时候密码将会变成明文,故而导致登录不成功.所以我们在admin.py可以通过form自定义进行对password进行操作,可以双 ...
- 7 Python 数据类型—列表
列表(list)是Python以及其他语言中最常用到的数据结构之一.Python使用使用中括号 [ ] 来解析列表 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置, ...
- codeforces 653A A. Bear and Three Balls(水题)
题目链接: A. Bear and Three Balls time limit per test 2 seconds memory limit per test 256 megabytes inpu ...