这里提供一份基于PCL库实现点云聚类并可视化聚类质心的C++代码,代码注释比较详细,可以参考下:

#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/segmentation/extract_clusters.h>
#include <pcl/visualization/cloud_viewer.h>

int main(int argc, char** argv)
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

    // 从PCD文件中读取点云数据,这里需要手动将PCD文件路径替换为自己的文件路径
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("/path/to/your/pointcloud.pcd", *cloud) == -1)
    {
        PCL_ERROR("Couldn't read file test_pcd.pcd \n");
        return (-1);
    }
    std::cout << "Loaded " << cloud->width * cloud->height << " data points from test_pcd.pcd with the following fields: " << std::endl;

    // 定义KDTree搜索对象
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);

    // 设置搜索半径,用于确定点与点之间的邻域关系
    float cluster_tolerance = 0.1;

    // 设置最小聚类大小,用于过滤掉点数较少的聚类
    int min_cluster_size = 100;

    // 设置最大聚类大小,用于过滤掉点数较多的聚类
    int max_cluster_size = 25000;

    // 定义欧氏聚类对象
    pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;

    // 设置搜索对象
    ec.setSearchMethod(tree);
    // 设置搜索半径
    ec.setClusterTolerance(cluster_tolerance);
    // 设置最小聚类大小
    ec.setMinClusterSize(min_cluster_size);
    // 设置最大聚类大小
    ec.setMaxClusterSize(max_cluster_size);
    // 设置输入点云数据
    ec.setInputCloud(cloud);

    // 定义存储聚类结果的向量
    std::vector<pcl::PointIndices> cluster_indices;

    // 执行聚类操作
    ec.extract(cluster_indices);

    // 定义可视化窗口对象
    pcl::visualization::PCLVisualizer viewer("Cluster viewer");

    // 定义显示点云的颜色
    float colors[][3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1}, {1, 1, 0}, {1, 0, 1}, {0, 1, 1}, {0.5, 0, 0}, {0, 0.5, 0}, {0, 0, 0.5}, {0.5, 0.5, 0}, {0.5, 0, 0.5}, {0, 0.5, 0.5} };
    int color_index = 0;

    // 遍历聚类结果向量
    for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin(); it != cluster_indices.end(); ++it)
    {
        // 定义存储聚类点云的指针
        pcl::PointCloud<pcl::PointXYZ>::Ptr cluster_cloud(new pcl::PointCloud<pcl::PointXYZ>);

        // 遍历当前聚类的所有点
        for (std::vector<int>::const_iterator pit = it->indices.begin(); pit != it->indices.end(); ++pit)
        {
            // 将当前点添加到聚类点云中
            cluster_cloud->points.push_back(cloud->points[*pit]);
        }

        // 将聚类点云添加到可视化窗口中
        pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color(cluster_cloud, colors[color_index % 12][0], colors[color_index % 12][1], colors[color_index % 12][2]);
        viewer.addPointCloud<pcl::PointXYZ>(cluster_cloud, color, "cluster_" + std::to_string(color_index));

        // 计算聚类质心
        Eigen::Vector4f centroid;
        pcl::compute3DCentroid(*cluster_cloud, centroid);

        // 可视化聚类质心
        pcl::PointXYZ center_point(centroid(0), centroid(1), centroid(2));
        viewer.addSphere(center_point, 0.1, "centroid_" + std::to_string(color_index));

        // 更新颜色索引
        color_index++;
    }

    // 设置可视化窗口背景颜色
    viewer.setBackgroundColor(1, 1, 1);

    // 显示可视化窗口
    while (!viewer.wasStopped())
    {
        viewer.spinOnce();
    }

    return 0;
}

注意,使用该代码需要安装PCL库,并将PCD文件路径替换为自己的文件路径。另外,该代码只展示了如何聚类并可视化聚类质心,聚类算法的参数设置和优化还需要根据具体情况进行调整

求取点云聚类质心并将其可视化的c++代码

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

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