PCL1.8.1 分割 - 欧式聚类

我的梦境 提交于 2019-12-06 02:19:12

Euclidean Cluster Extraction

欧式聚类流程如下:

http://pointclouds.org/documentation/tutorials/cluster_extraction.php#cluster-extraction

#include <pcl/kdtree/kdtree.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/segmentation/extract_clusters.h>

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);

// Creating the KdTree object for the search method of the extraction
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);
tree->setInputCloud (cloud_filtered);

std::vector<pcl::PointIndices> cluster_indices;
pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
ec.setClusterTolerance (0.02); //设置近邻搜索的搜索半径2cm
ec.setMinClusterSize (100);    //设置一个聚类需要的最少点数目
ec.setMaxClusterSize (25000);  //设置一个聚类需要的最大数目
ec.setSearchMethod (tree);     //设置点云的搜索方法
ec.setInputCloud (cloud_filtered);
ec.extract (cluster_indices);        //从点云中提取聚类并保存到cluster_indices中

//保存聚类后的点到磁盘
int j = 0;
for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin (); it != cluster_indices.end (); ++it)
{
   pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_cluster (new pcl::PointCloud<pcl::PointXYZ>);
   for (std::vector<int>::const_iterator pit = it->indices.begin (); pit != it->indices.end (); ++pit)
     cloud_cluster->points.push_back (cloud_filtered->points[*pit]); //*
   cloud_cluster->width = cloud_cluster->points.size ();
   cloud_cluster->height = 1;
   cloud_cluster->is_dense = true;

   std::cout << "PointCloud representing the Cluster: " << cloud_cluster->points.size () << " data points." << std::endl;
   std::stringstream ss;
   ss << "cloud_cluster_" << j << ".pcd";
   writer.write<pcl::PointXYZ> (ss.str (), *cloud_cluster, false); //*
   j++;
}

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!