2012-05-25 4 views
0

Kinect Сейчас я работаю с PCL и Kinect, функции обратного вызова показан ниже:Как использовать PCL для фильтрации облака точек данных из

Я хочу сделать некоторую фильтрацию, но я не могу получить доступ к «облаку» в функции обратного вызова напрямую, потому что он является постоянным типом, поэтому я копирую его в «cloud2», чтобы увидеть, работает ли он.

В результате получается компиляция, но ошибка времени выполнения, любая помощь мне?

class SimpleOpenNIProcessor 
{ 
public: 
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2; 
    SimpleOpenNIProcessor() : viewer ("PCL OpenNI Viewer") {} 
    void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud) 
    { 

    *(cloud2)=*(cloud); 
    if (!viewer.wasStopped()) 
     viewer.showCloud (cloud); 

    } 

    void run() 
    { 

    // create a new grabber for OpenNI devices 
    pcl::Grabber* interface = new pcl::OpenNIGrabber(); 

    // make callback function from member function 
    boost::function<void (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr&)> f = 
     boost::bind (&SimpleOpenNIProcessor::cloud_cb_, this, _1); 

    // connect callback function for desired signal. In this case its a point cloud with color values 
    boost::signals2::connection c = interface->registerCallback (f); 

    // start receiving point clouds 
    interface->start(); 

    // wait until user quits program with Ctrl-C, but no busy-waiting -> sleep (1); 
    while (true) 
     sleep(1); 

    // stop the grabber 
    interface->stop(); 
    } 
     pcl::visualization::CloudViewer viewer; 

}; 

int main() 
{ 

    SimpleOpenNIProcessor v; 
    v.run(); 
    return (0); 
} 

ответ

4
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2; 

Это определяет только cloud2, вам необходимо также создать его в куче иначе вы получите плохой доступ к памяти (как сво указатель).

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>()); 

Кроме того, вы не должны делать

*cloud2 = *cloud; 

Это не хороший чистый способ копирования следует использовать.

pcl::copyPointCloud<PointT, PointT>(*cloud, *cloud2); 

(Мой ответ выше относится также и вы должны сделать оба!)

+0

Добро пожаловать на переполнение стека! Чтобы устранить проблему форматирования, которую вы видели с помощью шаблонов, вам необходимо убедиться, что вы помечаете свой код как таковой, используя кнопку {} в редакторе. На данный момент я отредактировал его для вас. – Flexo

+0

Спасибо ~ это работает. –

Смежные вопросы