2016-10-09 1 views
4

Je travaille avec PCL pour traiter un nuage de points de manière à terminer la détection d'objets dans la scène. J'ajoute un type de PiontT personnalisé et ça marche très bien avec moi. Cependant, je suis aux prises avec les algorithmes de filtrage dans la bibliothèque PCL. J'ai essayé l'élimination statistique, radiale et conditionnelle des valeurs aberrantes pour éliminer le bruit. Le statistique n'a pas retourné les résultats (il me semble que c'est dans une boucle infinie), le rayon renvoie d'autre part un nuage de taille 0. et le conditionnel renvoie effectivement le même nuage sans enlever aucun point. dans les deux rayon et statistique, je suis l'exemple donné mais cela n'a pas fonctionné. Pour l'instant, je pense que le retrait conditionnel est l'algorithme le plus approprié pour moi, parce que je veux enlever tous les points avec confiance pas dans la gamme entre [0.4 - 1]. Comme je l'ai déjà mentionné, j'utilise un type de point personnalisé. ci-dessous est le code pour le point Type (Tango3DPoitType) et la méthode qui utilisent la suppression conditionnelle.Pourquoi le filtre PCL conditionnel renvoie-t-il le même nuage de points?

Tango3DPoitType.h

#define PCL_NO_PRECOMPILE 
    #include <pcl/point_types.h> 
    #include <pcl/impl/point_types.hpp> 
    #include <pcl/point_cloud.h> 
    #include <pcl/impl/instantiate.hpp> 

    // Preserve API for PCL users < 1.4 
    #include <pcl/common/distances.h> 
    #include <pcl/io/pcd_io.h> 
    #include <pcl/kdtree/kdtree_flann.h> 
    #include <pcl/kdtree/impl/kdtree_flann.hpp> 
    #include <pcl/search/organized.h> 
    #include <pcl/search/impl/organized.hpp> 
    #include <pcl/filters/statistical_outlier_removal.h> 
    #include <pcl/filters/impl/statistical_outlier_removal.hpp> 
    #include <pcl/filters/radius_outlier_removal.h> 
    #include <pcl/filters/impl/radius_outlier_removal.hpp> 
    #include <pcl/filters/voxel_grid.h> 
    #include <pcl/filters/impl/voxel_grid.hpp> 
    #include <pcl/filters/voxel_grid_covariance.h> 
    #include <pcl/filters/impl/voxel_grid_covariance.hpp> 
    #include <pcl/filters/extract_indices.h> 
    #include <pcl/filters/impl/extract_indices.hpp> 
    #include <pcl/filters/conditional_removal.h> 
    #include <pcl/filters/impl/conditional_removal.hpp> 
    #include <pcl/segmentation/sac_segmentation.h> 
    #include <pcl/segmentation/impl/sac_segmentation.hpp> 
    #include <pcl/segmentation/extract_clusters.h> 
    #include <pcl/segmentation/impl/extract_clusters.hpp> 
    #include <pcl/sample_consensus/method_types.h> 
    #include <pcl/sample_consensus/model_types.h> 

    struct EIGEN_ALIGN16 _Tango3DPoitType 
    { 
     PCL_ADD_POINT4D; // This adds the members x,y,z which can also be accessed using the point (which is float[4]) 

     union 
     { 
     union 
     { 
      struct 
      { 
      uint8_t b; 
      uint8_t g; 
      uint8_t r; 
      uint8_t a; 
      }; float rgb; 
     }; uint32_t rgba; 
     }; 
     float Confidence; 
     EIGEN_MAKE_ALIGNED_OPERATOR_NEW }; 

    struct EIGEN_ALIGN16 Tango3DPoitType : public _Tango3DPoitType 
    { 
     inline Tango3DPoitType() 
     { 
     x = y = z = 0.0f; 
     data[3] = 1.0f; 
     r = b = a = 0; 
     g = 255; 
     Confidence = 0.0f; 
     } 

     inline Tango3DPoitType (float _Confidence) 
     { 
     x = y = z = 0.0f; 
     data[3] = 1.0f; 
     r = b = a = 0; 
     g = 255; 
     Confidence = _Confidence; 
     } 

     inline Tango3DPoitType (uint8_t _r, uint8_t _g, uint8_t _b) 
     { 
     x = y = z = 0.0f; 
     data[3] = 1.0f; 
     r = _r; 
     g = _g; 
     b = _b; 
     a = 0; 
     Confidence = 0; 
     } 

     inline Eigen::Vector3i getRGBVector3i() { return (Eigen::Vector3i (r, g, b)); } 
     inline const Eigen::Vector3i getRGBVector3i() const { return (Eigen::Vector3i (r, g, b)); } 
     inline Eigen::Vector4i getRGBVector4i() { return (Eigen::Vector4i (r, g, b, 0)); } 
     inline const Eigen::Vector4i getRGBVector4i() const { return (Eigen::Vector4i (r, g, b, 0)); } 

     EIGEN_MAKE_ALIGNED_OPERATOR_NEW }; 

    // Adding confidence as fourth data to XYZ 
    POINT_CLOUD_REGISTER_POINT_STRUCT (Tango3DPoitType, 
            (float, x, x) 
            (float, y, y) 
            (float, z, z) 
            (uint32_t, rgba, rgba) 
            (float, Confidence, Confidence) 
    ) 

    POINT_CLOUD_REGISTER_POINT_WRAPPER(Tango3DPoitType, _Tango3DPoitType) 

Suppression conditionnelle Méthode

void CloudDenoising(const pcl::PointCloud<Tango3DPoitType>::Ptr source, 
       const pcl::PointCloud<Tango3DPoitType>::Ptr target){ 

    // build the condition 
    pcl::ConditionAnd<Tango3DPoitType>::Ptr ConfidenceRangeCondition (new pcl::ConditionAnd<Tango3DPoitType>()); 

    ConfidenceRangeCondition->addComparison (pcl::FieldComparison<Tango3DPoitType>::ConstPtr (new pcl::FieldComparison<Tango3DPoitType> ("Confidence", pcl::ComparisonOps::GT, 0.5))); 
    ConfidenceRangeCondition->addComparison (pcl::FieldComparison<Tango3DPoitType>::ConstPtr (new pcl::FieldComparison<Tango3DPoitType> ("Confidence", pcl::ComparisonOps::LT, 1.1))); 

    // build the filter 
    pcl::ConditionalRemoval<Tango3DPoitType> conditionalRemoval; 
    conditionalRemoval.setCondition (ConfidenceRangeCondition); 
    conditionalRemoval.setInputCloud (source); 
    conditionalRemoval.setKeepOrganized(true); 

    // apply filter 
    conditionalRemoval.filter (*target); 
    } 

Je veux comprendre est que je suis en train de faire quelque chose de mal avec le type de point ou est-ce un bogue dans PCL bibliothèque.

Merci

Répondre

2

Vous rognez le nuage, mais il Leting encore organisé. Pour le résoudre, il suffit de supprimer la méthode .setKeepOrganized(true).