PCL: нет подходящей функции преобразования, когда я использую std :: bind в setConditionFunction

Прошу прощения за этот вопрос, но я новичок в C ++.

Я хочу использовать pcl::ConditionalEuclideanClustering::setConditionFunction в своей функции класса. и используйте в качестве параметра другую функцию класса.

Я сослался на ссылку и другие коды. Но все еще есть вопрос, когда я использую cec.setConditionFunction (std::bind(&tube_detect::customRegionGrowing, this, _1, _2, _3));:

нет подходящей функции преобразования из std :: _ Bind ‹std :: _ Mem_fn‹ bool (tube_detect :: *) (const PointTypeFull & point_a, const PointTypeFull & point_b, float squared_distance) ›(tube_detect , boost :: arg ‹1›, boost :: arg ‹2›, boost :: arg ‹3›) ›в bool () (const PointTypeFull &, const PointTypeFull &, float) существует

Вот мой код:

#include <ros/ros.h>
#include <pcl/point_cloud.h>
#include <pcl_conversions/pcl_conversions.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl/io/pcd_io.h>

#include <pcl/point_types.h>
#include <pcl/console/time.h>

#include <pcl/filters/voxel_grid.h>
#include <pcl/features/normal_3d.h>
#include <pcl/segmentation/conditional_euclidean_clustering.h>

typedef pcl::PointXYZI PointTypeIO;
typedef pcl::PointXYZINormal PointTypeFull;

class tube_detect{
  public:
    pcl::PointCloud<PointTypeIO>::Ptr cloud_in, cloud_out;
    pcl::PointCloud<PointTypeFull>::Ptr cloud_with_normals ;
    pcl::IndicesClustersPtr clusters , small_clusters, large_clusters;
    pcl::search::KdTree<PointTypeIO>::Ptr search_tree;
    pcl::console::TicToc tt;
    // tube_detect();
    void copy_load_point_cloud(pcl::PointCloud<PointTypeFull>::Ptr copy_cloud_with_normal);
    void modify_intensity_indices();
    void normal();
    bool customRegionGrowing(const PointTypeFull& point_a, const PointTypeFull& point_b, float squared_distance);

};

void tube_detect::normal(){
    // Set up a Conditional Euclidean Clustering class
     std::cerr << "Segmenting to clusters...\n", tt.tic ();
     pcl::ConditionalEuclideanClustering<PointTypeFull> cec (true);
     cec.setInputCloud (cloud_with_normals);
      
     // **here is the error happen**
     cec.setConditionFunction (std::bind(&tube_detect::customRegionGrowing, this, _1, _2, _3));
     

     cec.setClusterTolerance (1.0);
     cec.setMinClusterSize (cloud_with_normals->points.size () / 1000);
     cec.setMaxClusterSize (cloud_with_normals->points.size () / 5);
     cec.segment (*clusters);
     cec.getRemovedClusters (small_clusters, large_clusters);
     std::cerr << ">> Done: " << tt.toc () << " ms\n";
}

bool 
tube_detect::customRegionGrowing (const PointTypeFull& point_a, const PointTypeFull& point_b, float squared_distance)
{
  Eigen::Map<const Eigen::Vector3f> point_a_normal = point_a.getNormalVector3fMap (), point_b_normal = point_b.getNormalVector3fMap ();
  if (squared_distance < 1)
  {
    if (std::abs (point_a.intensity - point_b.intensity) < 8.0f)
      return (true);
    if (std::abs (point_a_normal.dot (point_b_normal)) < 0.1)
      return (true);
  }
  else
  {
    if (std::abs (point_a.intensity - point_b.intensity) < 3.0f)
      return (true);
  }
  return (false);
}

=============================


person zouhbwll    schedule 21.06.2020    source источник


Ответы (2)


Я использую PCL-1.7, и он устанавливается при установке ROS-Kinetic.

setConditionFunction определяется только как:

      inline void
      setConditionFunction (bool (*condition_function) (const PointT&, const PointT&, float)) 
      {
        condition_function_ = condition_function;
      }

Итак, я не могу использовать std::bind.

кстати, кажется, что я не могу использовать более высокий pcl версия.

Для каждого дистрибутива ROS, на REP 103, мы официально поддерживаем только 1 версию PCL.

person zouhbwll    schedule 21.06.2020

Я имел дело с похожей проблемой. Я хотел отфильтровать по переменному параметру external_parameter, но не смог передать его по списку параметров, потому что person Betschler    schedule 23.06.2021