从C ++文件(点云库)写入数据

时间:2012-12-10 05:17:32

标签: c++ depth point-clouds point-cloud-library

我正在使用点云库来获取深度图,然后每隔一秒左右将PCD文件写入内存,以便其他程序可以拾取它。

我让程序正确地使用可视化工具渲染深度图,除了实际写入文件的一行外,它都可以正常工作。

这是我的代码:

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

以下是我在尝试编写文件时遇到的错误:

/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

1 个答案:

答案 0 :(得分:2)

当您提供指针时,savePCDFileASCII()函数期望对PointCloud的const引用。你必须取消引用指针:

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

请记住,您的回调函数会尽可能频繁地触发(超过每秒一次),因此您可能希望限制导出。 更重要的是,如果你试图在其他程序读取数据时(或者反过来)写入数据,则程序可能会崩溃(竞争条件) 因此,您需要某种形式的同步或直接通过其他方式(例如套接字或管道)流式传输PointCloud。