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

sak*_*ami 5 c++ point-clouds point-cloud-library

我正在与 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)
Run Code Online (Sandbox Code Playgroud)

有条件去除法

  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); 
    } 
Run Code Online (Sandbox Code Playgroud)

我想了解是我对点类型做错了,还是 PCL 库中的错误。

谢谢

小智 3

你正在裁剪云,但它仍然井井有条。要解决这个问题,只需删除该方法即可.setKeepOrganized(true)