使用键盘回调事件保存屏幕截图

时间:2017-08-21 04:42:52

标签: c++ point-cloud-library

我正在尝试使用键盘回调事件在PCL Visualizer窗口中保存屏幕截图。以下是代码段:

#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>

void keyboardEventOccurred (const pcl::visualization::KeyboardEvent &event, void* viewer)
{
  if (event.getKeySym () == "s" && event.keyDown ())
  {
    viewer->saveScreenshot("Image.png");
  }
}

int main (int argc, char** argv)
{
    pcl::visualization::PCLVisualizer viewer("Cloud Viewer");

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr body (new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::io::loadPCDFile ("body.pcd", *body);
    viewer.addPointCloud (body,"body");
    viewer.registerKeyboardCallback (keyboardEventOccurred, &viewer);
    viewer.spin();
    return 0;
}

但是,数据字段之间存在一些不匹配,并且它返回以下错误:

[100%] Building CXX object CMakeFiles/pcl_visualizer.dir/pcl_visualizer.cpp.o
/home/ravi/pcl_visualizer/pcl_visualizer.cpp: In function ‘void keyboardEventOccurred(const pcl::visualization::KeyboardEvent&, void*)’:
/home/ravi/pcl_visualizer/pcl_visualizer.cpp:8:11: error: ‘void*’ is not a pointer-to-object type
     viewer->saveScreenshot("Image.png");
           ^
make[2]: *** [CMakeFiles/pcl_visualizer.dir/pcl_visualizer.cpp.o] Error 1

请问任何解决方法吗?

1 个答案:

答案 0 :(得分:2)

你的错误信息正在告诉你一切;回调中的void *是指回调提供程序不知道或关心什么类型的指针用于回调。

您似乎向它传递了一个指向查看器对象的指针,但是所有编译器都知道或关心的是它是一个n位数字,表示要为回调提供的内存。

通过使用void *删除类型的概念,编译器无法确定viewer-&gt; XXX的含义。

要解决此问题,最简单的方法是将指针转换为您认为应该是的;

之类的东西
pcl::visualization::PCLVisualizer* v = static_cast<pcl::visualization::PCLVisualizer*>(viewer)

然后你可以做v-&gt; XXX()

另外,我还建议你在C ++书中刷新指示。