以下是基于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.xseed_point.yseed_point.z的形式给出,您需要根据实际情况进行设置。

此代码将聚类结果可视化为不同颜色的点云簇。每个聚类簇都会在可视化窗口中显示为一个单独的点云。您可以使用鼠标和键盘控制PCL可视化窗口的交互。

基于181pcl库将欧式聚类改写为以已知点p为聚类起点并将聚类结果可视化的c++算法

原文地址: https://www.cveoy.top/t/topic/hXAa 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录