2017-08-21 1 views
0

キーボードコールバックイベントを使用してPCLビジュアライザウィンドウ内にスクリーンショットを保存しようとしています。キーボードコールバックイベントを使用してスクリーンショットを保存します。

しかし
#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

あなたが持っているエラーメッセージは本当にすべてを伝えています。コールバックのvoid *のポイントは、コールバックプロバイダがコールバックに使用されているポインタのタイプを知らない、または気にしないことです。

あなたはビューアオブジェクトへのポインタを渡すようですが、コンパイラが知っているか気にするのは、コールバックに提供するメモリを表すnビットの数値です。

void *を使用して型の概念を取り除くことで、viewer-> XXXが意味するものをコンパイラが設定する方法はありません。

この問題を解決するには、最も簡単な方法は、ポインタをキャストする必要があると思うようにキャストすることです。

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

のようなものあなたはサイドノートではV-> XXX()

を行うことができますが、私はまた、あなたがC++の本であなたのポインタをブラッシュアップを示唆しています。

+0

ああ...それは本当に重要でした。それは私の心を完全に滑らせました。素敵な説明をありがとうございました。それは魅力のように働く。 –

関連する問題