2016-11-11 2 views
0

Ich versuche, Template-Klassen zu verwenden, um meine Funktionen unabhängig vom Punkttyp zu verwenden. Ich habe das Tutorial "Eine neue PCL-Klasse schreiben" gelesen, aber ich habe es nicht verstanden. Ich werde die einfachste Klasse teilen, in der ich versuche, diese Technik zu verwenden. Seine einzige Funktion besteht darin, den KD-Baum einer Punktwolke am richtigen Punkt der Ausführung eines Elternbaums von Prozessen zu erzeugen.Klassentemplate zur Verarbeitung von pcl :: PointCloud-Objekten mit unterschiedlichen Punkttypen

KdtreeBuilder_Process.h

#ifndef KDTREEBUILDER_PROCESS_H 
#define KDTREEBUILDER_PROCESS_H 
#include "ProcessManager/ProcessConcurrent.h" //Parent class 
#include <pcl/kdtree/kdtree_flann.h> 

class KdtreeBuilder_Process:public ProcessConcurrent 
{ 
public: 
    KdtreeBuilder_Process(pcl::PointCloud<pcl::PointXYZ>::Ptr inputCloud,pcl::KdTree<pcl::PointXYZ>::Ptr cloudKdtree); 
    virtual void run(); //method that executed when the process starts 
private: 

    pcl::PointCloud<pcl::PointXYZ>::Ptr mInputCloud; 
    pcl::KdTree<pcl::PointXYZ>::Ptr mCloudKdtree; 
}; 

#endif // KDTREEBUILDER_PROCESS_H 

KdtreeBuilder_Process.cpp

#include "KdtreeBuilder_Process.h" 

KdtreeBuilder_Process::KdtreeBuilder_Process(pcl::PointCloud<pcl::PointXYZ>::Ptr inputCloud,pcl::KdTree<pcl::PointXYZ>::Ptr cloudKdtree): 
    mInputCloud(inputCloud),mCloudKdtree(cloudKdtree) 
{ 

} 

void KdtreeBuilder_Process::run(){ 
    mCloudKdtree->setInputCloud(mInputCloud); 
} 

Meine Absicht ist es, diese Klasse mit einem beliebigen Punkt Typ zu verwenden, die XYZ-Koordinaten enthält

Vielen Dank für Ihre Unterstützung . BR

Antwort

0

Ich löse das Problem. Hier ist die endgültige Lösung nur Header-Datei mit:

KdtreeBuilder_Process.h

#ifndef KDTREEBUILDER_PROCESS_H 
#define KDTREEBUILDER_PROCESS_H 
#include "ProcessManager/ProcessConcurrent.h" 
#include "PointDefinitions.h" 
#include <pcl/kdtree/kdtree_flann.h> 
#include <QDebug> 

template<class PointType> 
class KdtreeBuilder_Process:public ProcessConcurrent 
{ 
    typedef typename pcl::PointCloud<PointType>::Ptr PointCloudPtr; 
    typedef typename pcl::KdTree<PointType>::Ptr KdTreePtr; 

public: 

    KdtreeBuilder_Process(PointCloudPtr inputCloud,KdTreePtr cloudKdtree): mInputCloud(inputCloud), mCloudKdtree(cloudKdtree) { } 
     virtual void run(){ 
      mCloudKdtree->setInputCloud(mInputCloud); 
     } 
    private: 

     PointCloudPtr mInputCloud; 
     KdTreePtr mCloudKdtree; 
}; 

#endif // KDTREEBUILDER_PROCESS_H 
0

Als erstes müssen Sie bei Vorlagen akzeptieren, dass alle Implementierungen in Headerdateien verschoben werden müssen. Wenn Sie möchten, KdtreeBuilder_Process eine Vorlage sein, die Klasse von Punkt im Parameter führt Sie nur entsprechende Template-Deklaration Syntax hinzufügen müssen:

template<class PointType> 
class KdtreeBuilder_Process:public ProcessConcurrent 
{ 
public: 

Wenn PointCloud Klasse ist bereit, alle Klassen zu akzeptieren, mit XYZ-Koordinaten müssen Sie nur Ihre ändern Code entsprechend

KdtreeBuilder_Process(pcl::PointCloud<PointType>::Ptr inputCloud,pcl::KdTree<PointType>::Ptr cloudKdtree): mInputCloud(inputCloud), mCloudKdtree(cloudKdtree) { } 
    virtual void run(){ 
     mCloudKdtree->setInputCloud(mInputCloud); 
    } 
private: 

    pcl::PointCloud<PointType>::Ptr mInputCloud; 
    pcl::KdTree<PointType>::Ptr mCloudKdtree; 
}; 

Viel Glück!

+0

Vielen Dank für Ihre Antwort @ W.F. Sieht einfach aus, aber ich habe Probleme mit den Konstruktor Parametern. Ist es nicht möglich Boost Shared Pointer im Konstruktor einer Template-Klasse zu integrieren? Ich habe den Fehler "C2061: Syntaxfehler: Bezeichner 'Ptr'" –

Verwandte Themen