cluster
segmentation
Euclidean Cluster Extraction
#include <pcl/segmentation/extract_clusters.h>
#include <pcl/search/kdtree.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
tree->setInputCloud(cloud);
pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
ec.setClusterTolerance(0.02); // 2 cm
ec.setMinClusterSize(50);
ec.setMaxClusterSize(25000);
ec.setSearchMethod(tree);
ec.setInputCloud(cloud);
std::vector<pcl::PointIndices> cluster_indices;
ec.extract(cluster_indices);
int id = 0;
for (const auto &indices : cluster_indices)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cluster(new pcl::PointCloud<pcl::PointXYZ>);
for (int idx : indices.indices)
cluster->points.push_back(cloud->points[idx]);
cluster->width = cluster->points.size();
cluster->height = 1;
cluster->is_dense = true;
std::cout << "Cluster " << id++ << " size = " << cluster->size() << std::endl;
}
Supervoxel Clustering
pcl::SupervoxelClustering<pcl::PointXYZ> super(0.05 /*voxel res*/, 0.1 /*seed res*/);
super.setInputCloud(cloud);
std::map<std::uint32_t, pcl::Supervoxel<pcl::PointXYZ>::Ptr> supervoxel_clusters;
super.extract(supervoxel_clusters);