2016-10-09 16 views
4

Я работаю с PCL, чтобы обработать облако точек, чтобы закончить с обнаружением объектов в сцене.Почему условный фильтр PCL возвращает одно и то же облако точек?

Я добавляю пользовательский тип PiontT, и он отлично работает со мной. Однако я борюсь с алгоритмами фильтрации в библиотеке PCL. Я попытался удалить статистический, радиус и условный выброс, чтобы удалить шум. Статистические данные не возвращали результаты (как мне кажется, в бесконечном цикле), радиус, с другой стороны, возвращает облако с размером 0. И условное фактически возвращает одно и то же облако, не удаляя ни одной точки. как в радиусе, так и в статистическом, я следую приведенному примеру, но они не работают.

На данный момент я считаю, что условное удаление является наиболее подходящим для меня алгоритмом, потому что я хочу с уверенностью удалить любые точки в диапазоне между [0,4 - 1]. Как я уже говорил, я использую настраиваемый тип точки. ниже приведен код для типа «Тип» (Tango3DPoitType) и метод, который использует условное удаление.

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) 

условного удаления Метод

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); 
    } 

Я хочу понять, как я делаю что-то неправильно с типом точки или это ошибка в PCL библиотека.

Спасибо

ответ

2

Вы кадрирование облака, но она по-прежнему Leting организовано. Чтобы решить проблему, просто удалите метод .setKeepOrganized(true).