PCL点云处理之欧氏聚类(八)

本文介绍了PCL中欧氏聚类的原理,从寻找空间中点的最近邻开始,逐步形成类Q,并通过不断迭代直到无法添加新点为止。个人理解中区分了聚类、区域生长和多特征约束生长的不同,并提到了在图像处理和点云处理领域的应用。同时,提供了实验代码示例,展示了聚类效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PCL点云处理之欧几里得聚类

聚类原理

(1)找到空间中某点p10,有kdTree找到离他最近的n个点,判断这n个点到p的距离。将距离小于阈值r的点p12,p13,p14…放在类Q里
(2)在 Q去除p10的区间里找到一点p12,重复1
(3)在 Q去除p10,p12 找到一点,重复1,找到p22,p23,p24…全部放进Q里
(4)当 Q 再也不能有新点加入了,则完成搜索了

个人理解

只根据距离聚类,且对聚类起始点无要求,通常称聚类
根据距离聚类,且对聚类起始点有一定要求的,通常称区域生长
根据多种条件约束聚类,且对聚类起始点有一定要求的,通常称多特征约束生长
论文中对于多特征约束生长使用较多,通过改变起始点的选择方法和生长时的约束条件作为创新,
在图像处理邻域该聚类方法又叫做连通性分析,不过图像opencv中使用的是像素之间的二维水平距离,点云pcl库使用的是点与点之间的三维空间距离。

实验代码

只需改变文件读取写出的路径,直接复制黏贴即可使用,这里主要是分批赋色输出多个pcd文件,其他都是pcl模块直接调用即可

#include <p
点云的欧氏距离聚类是一种将点云中的点按照欧氏距离进行聚类的方法。PCL(Point Cloud Library)是一个强大的点云处理库,提供了各种点云处理分析算法。以下是一个使用 PCL C++库进行点云欧氏距离聚类的示例: ```c++ #include <iostream> #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/visualization/pcl_visualizer.h> #include <pcl/filters/extract_indices.h> #include <pcl/segmentation/progressive_morphological_filter.h> #include <pcl/segmentation/extract_clusters.h> int main(int argc, char** argv) { // 加载点云数据 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>("sample.pcd", *cloud); // 欧氏距离聚类 pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>); tree->setInputCloud(cloud); std::vector<pcl::PointIndices> cluster_indices; pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec; ec.setClusterTolerance(0.02); // 设置聚类的欧氏距离阈值 ec.setMinClusterSize(100); // 设置聚类的最小点数 ec.setMaxClusterSize(25000); // 设置聚类的最大点数 ec.setSearchMethod(tree); ec.setInputCloud(cloud); ec.extract(cluster_indices); // 执行聚类操作 // 可视化聚类结果 pcl::visualization::PCLVisualizer viewer("Cluster viewer"); viewer.setBackgroundColor(0, 0, 0); // 背景色设为黑色 int cluster_color[6][3] = {{255, 0, 0}, {0, 255, 0}, {0, 0, 255}, {255, 255, 0}, {0, 255, 255}, {255, 0, 255}}; // 定义不同聚类的颜色 int cluster_id = 0; for (auto it = cluster_indices.begin(); it != cluster_indices.end(); ++it) { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_cluster(new pcl::PointCloud<pcl::PointXYZ>); for (auto pit = it->indices.begin(); pit != it->indices.end(); ++pit) cloud_cluster->points.push_back(cloud->points[*pit]); // 将聚类的点放入一个点云中 cloud_cluster->width = cloud_cluster->points.size(); cloud_cluster->height = 1; cloud_cluster->is_dense = true; // 绘制聚类结果 pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cluster_color_handler(cloud_cluster, cluster_color[cluster_id % 6][0], cluster_color[cluster_id % 6][1], cluster_color[cluster_id % 6][2]); viewer.addPointCloud(cloud_cluster, cluster_color_handler, "cluster_" + std::to_string(cluster_id)); viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cluster_" + std::to_string(cluster_id)); ++cluster_id; } while (!viewer.wasStopped()) viewer.spinOnce(); return 0; } ``` 在上述代码中,我们先使用 `pcl::io::loadPCDFile` 函数加载点云数据。接着,我们使用 `pcl::EuclideanClusterExtraction` 算法进行欧氏距离聚类。可以通过 `setClusterTolerance`、`setMinClusterSize` 和 `setMaxClusterSize` 函数分别设置聚类的欧氏距离阈值、最小点数和最大点数。最后,我们使用 `pcl::visualization::PCLVisualizer` 可视化聚类结果。 注意,在使用 PCL 进行点云处理时,需要在编译时链接 PCL 库。在 Ubuntu 系统上,可以使用以下命令安装 PCL 库: ``` sudo apt-get install libpcl-dev ``` 在编译时,需要将 PCL 库链接到程序中。例如,可以使用以下命令编译上述代码: ``` g++ cluster.cpp -o cluster -l pcl_io -l pcl_visualization -l pcl_filters -l pcl_segmentation ``` 其中,`-l pcl_io`、`-l pcl_visualization`、`-l pcl_filters` 和 `-l pcl_segmentation` 分别表示链接 PCL 库中的 `pcl_io`、`pcl_visualization`、`pcl_filters` 和 `pcl_segmentation` 模块。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云学徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值