需求:通过PCL库的欧式聚类判断点云中有多少个团簇。
实现代码:
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/segmentation/extract_clusters.h>
#include <pcl/kdtree/kdtree.h>
int main()
{
// 加载点云数据
PointCloud::Ptr cloud(new PointCloud);
// ... 从文件或其他来源加载点云数据 ...
// 创建 KdTree 对象
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
tree->setInputCloud(cloud);
// 创建欧式聚类对象
pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
ec.setClusterTolerance(1); // 设置聚类阈值-点到点的距离
ec.setMinClusterSize(500); // 设置最小聚类大小-一个团簇中点数量的最小值
ec.setMaxClusterSize(25000); // 设置最大聚类大小-一个团簇中点数量的最大值
ec.setSearchMethod(tree);
ec.setInputCloud(cloud);
// 获取聚类索引
std::vector<pcl::PointIndices> cluster_indices;
ec.extract(cluster_indices);
// 计算聚类数量
int num_clusters = cluster_indices.size();
std::cout << "点云中共有 " << num_clusters << " 个团簇" << std::endl;
return 0;
}