以下是一个简单的示例代码,将点云聚类结果保存到不同的类中心点所在的文件中:

#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.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>('input.pcd', *cloud);

    // 计算法线
    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
    ne.setInputCloud(cloud);
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
    ne.setSearchMethod(tree);
    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
    ne.setRadiusSearch(0.03);
    ne.compute(*normals);

    // 聚类
    pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
    ec.setClusterTolerance(0.02);
    ec.setMinClusterSize(100);
    ec.setMaxClusterSize(25000);
    ec.setSearchMethod(tree);
    ec.setInputCloud(cloud);
    std::vector<pcl::PointIndices> cluster_indices;
    ec.extract(cluster_indices);

    // 保存每个聚类的点云数据
    for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin(); it != cluster_indices.end(); ++it)
    {
        pcl::PointCloud<pcl::PointXYZ>::Ptr cluster(new pcl::PointCloud<pcl::PointXYZ>);
        for (std::vector<int>::const_iterator pit = it->indices.begin(); pit != it->indices.end(); ++pit)
            cluster->push_back((*cloud)[*pit]);
        cluster->width = cluster->size();
        cluster->height = 1;
        cluster->is_dense = true;

        // 保存点云数据到文件
        std::stringstream ss;
        ss << 'cluster_' << std::distance(cluster_indices.begin(), it) << '.pcd';
        pcl::io::savePCDFileASCII(ss.str(), *cluster);
    }

    return 0;
}

在上面的代码中,我们首先加载点云数据,然后计算法线。随后,我们使用EuclideanClusterExtraction类对点云进行聚类,并将每个聚类的点云数据保存到不同的文件中。在保存每个聚类的点云数据之前,我们需要先将它们存储在PointCloudpcl::PointXYZ对象中。最后,我们返回0表示成功执行程序。

C++ 代码:保存点云聚类结果到各个类中心点文件

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

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