从C++文件(点云库)获取数据

Wrtie Data from C++ File (Point Cloud Library)

本文关键字:获取 数据 C++ 文件      更新时间:2023-10-16

我正在使用点云库来获取深度图,然后每秒左右将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

savePCDFileASCII()函数在提供指针时需要对PointCloud的常量引用。您必须取消引用指针:

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

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