博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=171

自定义交互

多数情况下,默认的鼠标和键盘交互设置不能满足用户的需求,用户想扩展函数的某些功能,比如,按下键盘时保存点云的信息或者通过鼠标确定点云的位置,关于这些操作的一个简单示例代码见interactionCustomizationVis函数。在本小节的这部分,用户可以看到如何扑捉鼠标和键盘事件,在窗口单击右键,将会显示一个2D的文本标签,如图1所示,用户可以通过按下‘r’键擦掉这些文本。

图1 自定义交互示例

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

上面是实例化视窗的标准代码。

viewer->registerKeyboardCallback (keyboardEventOccurred, (void*)&viewer);
viewer->registerMouseCallback (mouseEventOccurred, (void*)&viewer);

上面的两行代码分别注册响应键盘和鼠标事件的keyboardEventOccurred和mouseEventOccurred回调函数,第二个参数就是所谓的cookies,是回调时传递给回调函数的参数。可以传递任意参数给回调函数,在本例中,我们以视窗对象本身为参数传递给回调函数,目的是在用户交互时,调用回调函数需要改变视窗对象的内容,需要注意的是这些参数必须用单个void*的形式,所以我们需要将指针boost::shared_ptr强制转换为void*。

void mouseEventOccurred (const pcl::visualization::MouseEvent &event,
void* viewer_void)
{
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);
if (event.getButton () == pcl::visualization::MouseEvent::LeftButton && event.getType () == pcl::visualization::MouseEvent::MouseButtonRelease)
{
std::cout << "Left mouse button released at position (" << event.getX () << ", " << event.getY () << ")" << std::endl;
char str[]; sprintf (str, "text#%03d", text_id ++);
viewer->addText ("clicked here", event.getX (), event.getY (), str);
}
}

这就是处理鼠标事件的函数,每次响应鼠标事件时,都会回调该函数。为了响应我们关心的事件,需要从event实例提取事件信息,在本例中,查找鼠标左键的释放事件,每次响应这种事件时,都会在鼠标按下的位置上生成一个小的文本标签。

void keyboardEventOccurred (const pcl::visualization::KeyboardEvent &event,
void* viewer_void)
{
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);
if (event.getKeySym () == "r" && event.keyDown ())
{
std::cout << "r was pressed => removing all text" << std::endl; char str[];
for (unsigned int i = ; i < text_id; ++i)
{
sprintf (str, "text#%03d", i);
viewer->removeShape (str);
}
text_id = ;
}
}

同样的方法适用于键盘事件,我们检验按下了那个键,如果按下‘r’键,则删除前面鼠标所产生的文本标签,需要注意的是,当按下‘r’键时,3D相机仍会重置,所以,在PCL中视窗中注册的事件响应回调函数,不会覆盖其他成员对同一事件的响应。

敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。

参考文献:

1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版社2012-10

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

  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可视化类(1)

    PCLVisualizer可视化类是PCL中功能最全的可视化类,与CloudViewer可视化类相比,PCLVisualizer使用起来更为复杂,但该类具有更全面的功能,如显示法线.绘制多种形状和多个 ...

  5. PCLVisualizer可视化类(2)

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

  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. c的详细学习(5)数组

        到目前为止,前面介绍的都是属于基本类型的数据.除此之外,C语言还提供了一些更为复杂的数据类型,称为构造类型.数组就是最基本的构造类型.若要针对一批数据进行某种操作,采用数组是一种方便可行的方法 ...

  2. 期刊搜索问题——SCI、EI、IEEE和中文期刊

    1.SCI.EI收录是什么意思? SCI和EI都是收录,并不是实体的期刊出版社,相当于具有高品质期刊出版社的合体(或统充),隔一段时间(几年或者几个月)SCI会进行评估,哪些出版社不具有被SCI收录的 ...

  3. 在linux系统下Git源码系统的文件下载

    Git是一个开源的分布式版本控制系统,在linux系统中下载git中的文件使用repo的很多. 网上有很多repo下载的地址失效,目前可用的链接在这里记录一下. 没有安装git的安装一下: sudo ...

  4. UITableViewCell高度自适应的关键点

    iOS开发中对于UITableViewCell高度自适应的文章已经很多很多,但如果cell内容比较复杂,刚使用autolayout配置自使用时还是总不能一次性成功. KEY POINT 这里只说设置的 ...

  5. 爬虫 spider

    python 2.x # -*- coding: utf-8 -*-import reimport urllib url = 'http://tieba.baidu.com/p/4872795764' ...

  6. ATI AMD

    AMD是一个CPU公司,而ATI是一个显卡公司.在2006年7月24日,AMD公司将ATI公司百分之百收购了,也自然和AMD结为一体,也生产显卡了.它们的区别如下1:它们生产的物品不同,AMD生产处理 ...

  7. FOJ 2213 简单几何

    题意:给你两个圆的圆心坐标和半径,判断两个圆公切线数目. 思路:考虑两个圆间公切线的情况,两个圆的位置关系分为相离,相交,外切,内切,内含,重合,公切线数分别为4,2,3,1,0,-1. #inclu ...

  8. nginx expires缓存提升网站负载

    语法: expires [time|epoch|max|off]默认值: expires off作用域: http, server, location使用本指令可以控制HTTP应答中的“Expires ...

  9. Victor/ArrayList/LinkedList/Stack/CopyOnWriteArrayList 区别

    Victor:采用数组的方式存储数据,与ArrayList相同,线程安全.性能比ArrayList差 ArrayList:采用数据的方式存储数据,线程不安全.ArrayList使用数组来存储数据,使用 ...

  10. Java -- eclipse常用快捷键