Я использую библиотеку облаков точек, чтобы получить карту глубины и затем каждую секунду или около того записывать файл 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 напрямую через другие средства (например, через сокет или канал).
Других решений пока нет …