2017-08-21 2 views
0

Ich versuche, den Screenshot im PCL Visualizer-Fenster mithilfe des Tastatur-Callback-Ereignisses zu speichern. Unten ist der Code-Schnipsel:Screenshot mit Tastatur-Callback-Ereignis speichern

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

Allerdings gibt es einige Diskrepanz zwischen Datenfeldern und es folgende Fehlerzurückkehrt:

[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 

Jede Abhilfe, bitte?

Antwort

1

Die Fehlermeldung, die Sie haben, sagt Ihnen wirklich alles; Der Punkt von void * in Ihrem Callback ist, dass der Callback-Provider nicht weiß oder sich darum kümmert, welcher Typ von Pointer für den Callback verwendet wird.

Sie scheinen einen Zeiger auf das Viewer-Objekt zu übergeben, aber der Compiler weiß oder interessiert sich, dass es sich um eine n-Bit-Zahl handelt, die etwas Speicher für den Callback darstellt.

Durch Entfernen des Konzepts von type mit void * kann der Compiler nicht feststellen, was mit viewer-> XXX gemeint ist.

Um das Problem zu lösen, ist der einfachste Weg, den Zeiger zu werfen, was Sie denken, dass es sein sollte; so etwas wie

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

können Sie dann tun v-> XXX()

Auf einer Seite zur Kenntnis, würde ich auch auf dem Zeiger in C++ Buch auffrischen empfehlen.

+0

Ohhh ... das war wirklich wichtig. Es ist mir völlig entfallen. Vielen Dank für die nette Erklärung. es funktioniert wie Charme. –

Verwandte Themen