PCLVisualizer可视化类(5)
博客转载自: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[512]; 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[512]; for (unsigned int i = 0; i < text_id; ++i) { sprintf (str, "text#%03d", i); viewer->removeShape (str); } text_id = 0; } }
同样的方法适用于键盘事件,我们检验按下了那个键,如果按下‘r’键,则删除前面鼠标所产生的文本标签,需要注意的是,当按下‘r’键时,3D相机仍会重置,所以,在PCL中视窗中注册的事件响应回调函数,不会覆盖其他成员对同一事件的响应。
敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。
参考文献:
1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版社2012-10