代码之家  ›  专栏  ›  技术社区  ›  ravi

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

  •  2
  • ravi  · 技术社区  · 7 年前

    我正在尝试使用键盘回调事件在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
    

    2 回复  |  直到 7 年前
        1
  •  2
  •   UKMonkey    7 年前

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

    通过使用void*删除类型的概念,编译器无法确定viewer是什么意思->XXX。

    要解决这个问题,最简单的方法是将指针投射到您认为应该是的位置;类似于

    pcl::visualization::PCLVisualizer* v = static_cast<pcl::visualization::PCLVisualizer*>(viewer)
    

    然后您可以执行v->XXX()

    另一方面,我还建议您在C++书籍中复习一下指针。

        2
  •  0
  •   Amir Gasmi    3 年前

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