基于181pcl库将欧式聚类改写为以已知点p为聚类起点并将聚类结果可视化的c++算法
以下是基于1.8.1版本的PCL库将欧式聚类改写为以已知点p为聚类起点并将聚类结果可视化的C++算法:
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/segmentation/extract_clusters.h>
typedef pcl::PointXYZ PointT;
int main(int argc, char** argv)
{
// 读取点云数据
pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
pcl::io::loadPCDFile<PointT>("input.pcd", *cloud);
// 创建欧式聚类对象
pcl::EuclideanClusterExtraction<PointT> ec;
ec.setClusterTolerance(0.02); // 设置聚类的容差
ec.setMinClusterSize(100); // 设置聚类的最小尺寸
ec.setMaxClusterSize(25000); // 设置聚类的最大尺寸
// 设置要聚类的点云数据
ec.setInputCloud(cloud);
// 设置聚类的起始点
pcl::PointXYZ seed_point;
seed_point.x = 1.0;
seed_point.y = 2.0;
seed_point.z = 3.0;
std::vector<pcl::PointIndices> cluster_indices;
ec.setIndices(std::vector<int>(1, cloud->points.size() - 1));
// 执行聚类
ec.extract(cluster_indices);
// 可视化聚类结果
pcl::visualization::PCLVisualizer viewer("Cluster viewer");
viewer.setBackgroundColor(0, 0, 0);
viewer.addPointCloud(cloud, "cloud");
int cluster_color = 1;
for (const auto& indices : cluster_indices)
{
pcl::PointCloud<PointT>::Ptr cluster(new pcl::PointCloud<PointT>);
for (const auto& index : indices.indices)
{
cluster->points.push_back(cloud->points[index]);
}
cluster->width = cluster->size();
cluster->height = 1;
cluster->is_dense = true;
std::string cluster_name = "cluster_" + std::to_string(cluster_color);
pcl::visualization::PointCloudColorHandlerCustom<PointT> cluster_color_handler(cluster, 255, 255, 255);
viewer.addPointCloud(cluster, cluster_color_handler, cluster_name);
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, cluster_name);
cluster_color++;
}
while (!viewer.wasStopped())
{
viewer.spinOnce();
}
return 0;
}
请注意,上述代码中的input.pcd是输入点云文件的路径。您需要将其替换为您自己的点云文件路径。此外,聚类起始点的坐标在代码中以seed_point.x,seed_point.y和seed_point.z的形式给出,您需要根据实际情况进行设置。
此代码将聚类结果可视化为不同颜色的点云簇。每个聚类簇都会在可视化窗口中显示为一个单独的点云。您可以使用鼠标和键盘控制PCL可视化窗口的交互。
原文地址: https://www.cveoy.top/t/topic/hXAa 著作权归作者所有。请勿转载和采集!