PCL Visualizer示例:无法获取键盘和鼠标事件

时间:2015-12-02 18:50:24

标签: c++ macos boost point-cloud-library

我在PCLVisualizer类的官方PCL文档中关注本教程:

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

我在键盘获取方面遇到了麻烦:当我选择渲染窗口,显示pointcloud,并尝试按“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时会发生这种错误。但是在文档中列出的代码中,变量定义得很好,所以我认为问题涉及shared_ptr.hpp库,或者它不是?

我在互联网上搜索了一个解决方案,但我没有找到任何可以解决问题的方法。

是否有人能够通过在OS X上运行它来获取pointcloud渲染窗口中的击键?

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

1 个答案:

答案 0 :(得分:1)

您没有显示任何代码,因此很难说出您的程序出了什么问题。

这是一个工作示例,在Ubuntu 14.04上使用PCL最新中继(VTK中继)进行测试:

#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获取更多详细信息),但它也不会阻止您使用它们。