为啥 PCL 条件过滤器返回相同的点云?

Posted

技术标签:

【中文标题】为啥 PCL 条件过滤器返回相同的点云?【英文标题】:Why PCL Conditional filter return the same point cloud?为什么 PCL 条件过滤器返回相同的点云? 【发布时间】:2017-02-17 22:41:41 【问题描述】:

我正在使用 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 库中的错误。

谢谢

【问题讨论】:

【参考方案1】:

您正在裁剪云,但它仍然有条理。 要解决它,只需删除方法.setKeepOrganized(true)

【讨论】:

以上是关于为啥 PCL 条件过滤器返回相同的点云?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 TDengine 数据库在相同的过滤条件下不能返回相同数量的行?

PCL:基于区域生长的点云分割原理与实现

PCL:过滤点云给定 2 线方程

点云处理技术之PCL滤波器——直通滤波器(pcl::PassThrough)

PCL 在没有云副本的八叉树上应用过滤器

PCL:ConditionRemoval 条件滤波(坐标约束 | 强度约束)