Запись данных из файла C++ (библиотека облаков точек)

Я использую библиотеку облаков точек, чтобы получить карту глубины, а затем примерно каждую секунду записываю файл 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;
 }

Вот ошибка, которую я получаю при попытке создать файл 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

person clifgray    schedule 10.12.2012    source источник


Ответы (1)


Функция savePCDFileASCII() ожидает константную ссылку на PointCloud, пока вы указываете указатель. Вы должны разыменовать указатель:

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

Имейте в виду, что ваша функция обратного вызова срабатывает как можно чаще (чаще одного раза в секунду), поэтому вы можете ограничить экспорт. И что более важно, если вы попытаетесь записать данные в то время, когда другая программа их читает (или наоборот), любая программа может выйти из строя (состояние гонки), поэтому вам потребуется какая-либо форма синхронизации или потоковая передача данных PointCloud напрямую через другую программу. средства (например, розетка или труба).

person Anonymous Coward    schedule 10.12.2012
comment
спасибо за помощь, которая заставила его работать правильно. Я планирую немного изменить его и замедлить до одного раза каждые пять секунд или около того, а также синхронизировать операции чтения/записи. Любая идея, почему он будет писать все числа как NAN? - person clifgray; 11.12.2012
comment
Обычно NAN возвращаются, когда аппаратное обеспечение не может определить значение глубины (или пиксель удаляется из-за внутренней коррекции/фильтрации ошибок). - person Anonymous Coward; 12.12.2012