2015年2月23日月曜日

Kinectからのデータ取得

 PCLではKinectから点群データを取得する際はOpenNIを用いる。

 PCLのチュートリアルではリアルタイムにデータを取得→画面に表示を行っているのみで取得された点群データは保存されないので数行コードを足してやる必要がある。コードは以下



コード

 #include "stdafx.h"

 #include <pcl/io/openni_grabber.h>
 #include <pcl/visualization/cloud_viewer.h>
 #include <pcl/io/pcd_io.h> 
 
 class SimpleOpenNIViewer
 {
   public:
     SimpleOpenNIViewer () : viewer ("PCL OpenNI Viewer") {}

     void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
     {
       if (!viewer.wasStopped())
         viewer.showCloud (cloud); 
         pcl::io::savePCDFileBinary("pointcloud.pcd", *cloud);
     }

     void run ()
     {
       pcl::Grabber* interface = new pcl::OpenNIGrabber();

       boost::function<void (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr&)> f =
         boost::bind (&SimpleOpenNIViewer::cloud_cb_, this, _1);

       interface->registerCallback (f);

       interface->start ();

       while (!viewer.wasStopped())
       {
         boost::this_thread::sleep (boost::posix_time::seconds (1));
       }

       interface->stop ();
     }

     pcl::visualization::CloudViewer viewer;
 };

 int _tmain (int argc, _TCHAR* argv[])
 {
   SimpleOpenNIViewer v;
   v.run ();
   return 0;
 }
 
 以上
 
 斜体+下線+太字にした部分はチュートリアルには無い部分でその部分で取得されたデー
タを保存する。
 このコードではプログラムが終了した瞬間のデータを保存するだけなので、起動した瞬間
から全てのデータを1フレームずつ保存した場合は保存するファイル名を動的に変えたりする
必要がある。

0 件のコメント:

コメントを投稿