欧式聚类
【摘要】 Euclidean Cluster Extraction欧式聚类流程如下:设置一个合适的聚类搜索半径Cluster-Tolerance很重要,如果半径过小,那么会分割出多个对象,如果设置太高会造成多个对应聚类到成一个,因此需要测试找到合适的搜索半径。http://pointclouds.org/documentation/tutorials/cluster_extraction.php#cl...
欧式聚类流程如下:
设置一个合适的聚类搜索半径Cluster-Tolerance很重要,如果半径过小,那么会分割出多个对象,如果设置太高会造成多个对应聚类到成一个,因此需要测试找到合适的搜索半径。
#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 extractionpcl::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); //设置近邻搜索的搜索半径2cmec.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++; }
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)