Прошу прощения за этот вопрос, но я действительно новичок в 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);
}
========================== =====