0

ポイント クラウド ライブラリを使用してデプス マップを取り込み、PCD ファイルを 1 秒ごとにメモリに書き込んで、別のプログラムで取得できるようにしています。

ビジュアライザーを使用して深度マップを正しくレンダリングするプログラムがあり、実際にファイルを書き込むための1行を除いてすべて機能します。

これが私のコードです:

 #include <pcl/io/openni_grabber.h>
 #include <iostream>
 #include <pcl/io/pcd_io.h>
 #include <pcl/visualization/cloud_viewer.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);
         //this is the line to write the file.
         //I am not sure it is the correct location.
         pcl::io::savePCDFileASCII ("test_pcd_here.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 main ()
 {
   SimpleOpenNIViewer v;
   v.run ();
   return 0;
 }

ファイルをcmakeしようとしたときに発生するエラーは次のとおりです。

/home/patrick/Desktop/kinect/grabber/openni_grabber.cpp: In member function ‘void SimpleOpenNIViewer::cloud_cb_(const ConstPtr&)’:
/home/patrick/Desktop/kinect/grabber/openni_grabber.cpp:15:59: error: no matching function for call to ‘savePCDFileASCII(const char [18], const ConstPtr&)’
/home/patrick/Desktop/kinect/grabber/openni_grabber.cpp:15:59: note: candidate is:
/usr/include/pcl-1.6/pcl/io/pcd_io.h:704:5: note: template<class PointT> int pcl::io::savePCDFileASCII(const string&, const pcl::PointCloud<PointT>&)
make[2]: *** [CMakeFiles/openni_grabber.dir/openni_grabber.cpp.o] Error 1
make[1]: *** [CMakeFiles/openni_grabber.dir/all] Error 2
make: *** [all] Error 2
4

1 に答える 1

3

savePCDFileASCII()関数はPointCloudポインターを指定している間、へのconst 参照を期待しています。ポインターを逆参照する必要があります。

pcl::io::savePCDFileASCII ("test_pcd_here.pcd", *cloud);

コールバック関数はできるだけ頻繁に (1 秒に 1 回以上) トリガーされることに注意してください。そのため、エクスポートを調整することをお勧めします。さらに重要なことに、他のプログラムがデータを読み取っている間にデータを書き込もうとすると (またはその逆)、いずれかのプログラムがクラッシュする可能性があるため (競合状態)、何らかの形式の同期が必要になるか、他のプログラムを介して PointCloud を直接ストリーミングする必要があります。手段 (ソケットやパイプなど)。

于 2012-12-10T11:17:39.367 に答える