2015-12-02 161 views
2

我下面这个教程类PCLVisualizer官方PCL文档中:PCL展台例如:无法获得键盘和鼠标事件

http://pointclouds.org/documentation/tutorials/pcl_visualizer.php

,我有与键盘收购的烦恼:当我选择渲染窗口,其中显示的点云,并尝试按“R”或“q”,没有任何反应,当我尝试按下鼠标左键,会显示以下文字:

Left mouse button released at position (413, 475)

及以下引发错误(在运行时):

Assertion failed: (px != 0), function operator->, file /usr/local/include/boost/smart_ptr/shared_ptr.hpp, line 687. 
Abort trap: 6 

我看到这种类型的错误发生在你不变量的声明初始化boost::shared_ptr。但是在文档中列出的代码中,变量已经定义好了,所以我想这个问题涉及到库,或者它不是?

我搜索在互联网上的一个解决方案,但我没有发现任何可能解决这一问题。

是否存在有人认为是能够获取按键的点云的通过在OS X上运行它提供窗口?

如果问题不明确,请告诉我。 非常感谢您的帮助或信息!

+0

我试图**初始化变量'viewer'的主要功能**和鼠标的收购工作:'提高:: shared_ptr的查看器(新PCL ::可视化: :PCLVisualizer(“3D Viewer”));',在我看来断言失败了,因为传递给回调'mouseEventOccured()'的指针没有正确初始化。但**键盘采集**仍然**不起作用**。 – Mauro

回答

1

你不显示任何代码,所以很难说你的程序有什么问题。

这里是一个工作示例,与PCL最新干线(VTK干线)在Ubuntu 14.04测试:

#include <iostream> 
#include <pcl/visualization/pcl_visualizer.h> 

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" << std::endl; 
    if (event.getKeySym() == "h" && event.keyDown()) 
    std::cout << "'h' was pressed" << std::endl; 
} 

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; 
} 

int main() 
{ 
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer); 
    viewer->addCoordinateSystem(); 
    viewer->registerKeyboardCallback(keyboardEventOccurred, (void*)&viewer); 
    viewer->registerMouseCallback(mouseEventOccurred, (void*)&viewer); 
    viewer->spin(); 
} 

注意一些关键笔划已使用的PCL可视化的一些行动(按h为更多细节),但它并不妨碍你使用它们。

+0

我在我的电脑上试过了你的代码,但键盘采集仍然无法工作。我点击了pointcloud的渲染窗口,使它成为焦点,并且我尝试推送'r'和'h':这些键永远不会被'keyboardEventOccurred'函数捕获,并且它们被我用来运行程序。我也试图改变按键,但没有改变。我正在** OS X El Capitan **上运行程序,也许这是一个OS X问题。无论如何,感谢您的帮助。 – Mauro

+0

我在官方bug跟踪器上报告了这个问题:https://github.com/PointCloudLibrary/pcl/issues/1465 –