以下是将点云聚类的质心点可视化的C++代码:

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/features/normal_3d.h>
#include <pcl/segmentation/region_growing.h>

int main(int argc, char** argv)
{
    // Load input file
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile<pcl::PointXYZ>("input_cloud.pcd", *cloud);

    // Voxel grid downsampling
    pcl::VoxelGrid<pcl::PointXYZ> vg;
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_downsampled(new pcl::PointCloud<pcl::PointXYZ>);
    vg.setInputCloud(cloud);
    vg.setLeafSize(0.01, 0.01, 0.01);
    vg.filter(*cloud_downsampled);

    // Normal estimation
    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
    pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
    tree->setInputCloud(cloud_downsampled);
    ne.setInputCloud(cloud_downsampled);
    ne.setSearchMethod(tree);
    ne.setRadiusSearch(0.05);
    ne.compute(*normals);

    // Region growing segmentation
    pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> rg;
    std::vector<pcl::PointIndices> clusters;
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree2(new pcl::search::KdTree<pcl::PointXYZ>);
    tree2->setInputCloud(cloud_downsampled);
    rg.setSearchMethod(tree2);
    rg.setInputCloud(cloud_downsampled);
    rg.setInputNormals(normals);
    rg.setMinClusterSize(50);
    rg.setMaxClusterSize(100000);
    rg.setSmoothnessThreshold(3.0 / 180.0 * M_PI);
    rg.setCurvatureThreshold(1.0);
    rg.extract(clusters);

    // Visualize clusters
    pcl::visualization::PCLVisualizer viewer("Cluster viewer");
    viewer.setBackgroundColor(0, 0, 0);
    viewer.addPointCloud(cloud_downsampled, "cloud");
    int cluster_num = 0;
    for (std::vector<pcl::PointIndices>::const_iterator it = clusters.begin(); it != clusters.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->push_back((*cloud_downsampled)[*pit]);
        cluster_cloud->width = cluster_cloud->size();
        cluster_cloud->height = 1;
        cluster_cloud->is_dense = true;

        pcl::PointXYZ centroid;
        pcl::computeCentroid(*cluster_cloud, centroid);

        std::stringstream ss;
        ss << "cluster_" << cluster_num;
        viewer.addPointCloud(cluster_cloud, ss.str());
        viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, ss.str());
        viewer.addSphere(centroid, 0.05, 1.0, 0.0, 0.0, ss.str() + "_centroid");

        cluster_num++;
    }

    viewer.spin();

    return 0;
}

这段代码使用了PCL库来进行点云聚类、质心点计算和可视化。具体步骤如下:

  1. 加载输入点云文件(PCD格式)。
  2. 对点云进行体素网格下采样,降低点云密度。
  3. 使用法线估计模块计算点云法线。
  4. 使用区域生长模块对点云进行聚类,得到每个聚类的索引。
  5. 对每个聚类,计算其质心点,并使用PCL可视化模块将其可视化。

其中,区域生长模块的参数可以根据实际情况进行调整,例如聚类的最大/最小大小、平滑度阈值、曲率阈值等


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

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