使用键盘回调事件保存屏幕截图
Save screenshot using keyboard callback event
我正在尝试使用键盘回调事件在 PCL Visualizer window 中保存屏幕截图。下面是代码片段:
#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
有什么解决办法吗?
您的错误消息确实告诉了您一切;回调中 void* 的要点是回调提供者不知道或不关心回调正在使用什么类型的指针。
您似乎向它传递了一个指向查看器对象的指针,但编译器只知道或关心它是一个 n 位数,表示要提供给回调的一些内存。
通过使用 void* 删除类型的概念,编译器无法确定 viewer->XXX 的含义。
要解决这个问题,最简单的方法是将指针转换为您认为应该的样子;像
pcl::visualization::PCLVisualizer* v = static_cast<pcl::visualization::PCLVisualizer*>(viewer)
然后你可以做 v->XXX()
附带说明一下,我还建议您温习一下 C++ 书中的指针。
我知道我的回答太晚了,但这会解决它,(编译器需要知道指向的对象的类型是 PCLVisualizer class 才能知道 saveScreenshot 方法是它的一部分,否则它无法猜测):
void keyboardEventOccurred(const pcl::visualization::KeyboardEvent& event, void* viewer)
{
if (event.getKeySym() == "s" && event.keyDown())
{
((pcl::visualization::PCLVisualizer*)viewer)->saveScreenshot("Image.png");
}
}
我正在尝试使用键盘回调事件在 PCL Visualizer window 中保存屏幕截图。下面是代码片段:
#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
有什么解决办法吗?
您的错误消息确实告诉了您一切;回调中 void* 的要点是回调提供者不知道或不关心回调正在使用什么类型的指针。
您似乎向它传递了一个指向查看器对象的指针,但编译器只知道或关心它是一个 n 位数,表示要提供给回调的一些内存。
通过使用 void* 删除类型的概念,编译器无法确定 viewer->XXX 的含义。
要解决这个问题,最简单的方法是将指针转换为您认为应该的样子;像
pcl::visualization::PCLVisualizer* v = static_cast<pcl::visualization::PCLVisualizer*>(viewer)
然后你可以做 v->XXX()
附带说明一下,我还建议您温习一下 C++ 书中的指针。
我知道我的回答太晚了,但这会解决它,(编译器需要知道指向的对象的类型是 PCLVisualizer class 才能知道 saveScreenshot 方法是它的一部分,否则它无法猜测):
void keyboardEventOccurred(const pcl::visualization::KeyboardEvent& event, void* viewer)
{
if (event.getKeySym() == "s" && event.keyDown())
{
((pcl::visualization::PCLVisualizer*)viewer)->saveScreenshot("Image.png");
}
}