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

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

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

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

нет подходящей функции преобразования из "std :: _ Bind (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);
}

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

1 Ответ

0 голосов
/ 21 июня 2020

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

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

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

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

кстати, это похоже на это Я не могу использовать более высокую версию pcl.

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

...