区域增长细分群集是错误的?

时间:2017-08-14 17:16:09

标签: c++ point-cloud-library point-clouds segment

我正在通过PCL点云库对我的房间点云进行分区。 彩色云如下所示: colored cloud

正如您所看到的,大多数群集都根据表面看起来。 但是,当我分开显示每个群集时,这些是一些结果: results 1

results 2

显然,群集与彩色云中的群集不同,但我不明白为什么。 我正在使用此代码将群集存储到分离的点云中:

//Store clusters into new pcls and all the clusters in an array of pcls 
    std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clusters_pcl; 
    for (int i = 0; i < clusters.size(); ++i) { 
            pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_cluster( 
                            new pcl::PointCloud<pcl::PointXYZRGB>); 
            cloud_cluster->width = clusters[i].indices.size(); 
            cloud_cluster->height = 1; 
            cloud_cluster->is_dense = true; 
            for (int j = 0; j < clusters[i].indices.size(); ++j) { 
                    //Take the corresponding point of the filtered cloud from the indices for the new pcl 
                    cloud_cluster->push_back( 
                                    point_cloud_ptr->at(clusters[i].indices[j])); 
            } 
            indices2.clear(); 
            //pcl::removeNaNFromPointCloud(*cloud_cluster, *cloud_cluster, indices2); 
            clusters_pcl.push_back(cloud_cluster); 
    } 

我的代码是做错了还是区域的输出实际上正在增长?

干杯

------------- EDIT -----------------

Here是我用于测试的点云。

这是完整的区域增长分段代码,它类似于教程中的代码:

std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> region_growing_segmentation(
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr) {
pcl::PointCloud<pcl::PointXYZRGB>& point_cloud = *point_cloud_ptr;
std::vector<int> indices2;
// Create the filtering object: downsample the dataset using a leaf size of 1cm
pcl::VoxelGrid<pcl::PointXYZRGB> vg;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered(
        new pcl::PointCloud<pcl::PointXYZRGB>);
vg.setInputCloud(point_cloud_ptr);
vg.setLeafSize(0.025f, 0.025f, 0.025f);
vg.filter(*cloud_filtered);
std::cout << "PointCloud after filtering has: "
        << cloud_filtered->points.size() << " data points." << std::endl;

pcl::search::Search<pcl::PointXYZRGB>::Ptr tree = boost::shared_ptr<
        pcl::search::Search<pcl::PointXYZRGB> >(
        new pcl::search::KdTree<pcl::PointXYZRGB>);
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> normal_estimator;
normal_estimator.setSearchMethod(tree);
normal_estimator.setInputCloud(cloud_filtered);
normal_estimator.setKSearch(50);
normal_estimator.compute(*normals);

pcl::RegionGrowing<pcl::PointXYZRGB, pcl::Normal> reg;
reg.setMinClusterSize(50);
reg.setMaxClusterSize(1000000);
reg.setSearchMethod(tree);
reg.setNumberOfNeighbours(100);
reg.setInputCloud(cloud_filtered);
reg.setInputNormals(normals);
reg.setSmoothnessThreshold(5.0 / 180.0 * M_PI);
reg.setCurvatureThreshold(1);

std::vector<pcl::PointIndices> clusters;
reg.extract(clusters);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr colored_cloud =
        reg.getColoredCloud();
pcl::visualization::CloudViewer viewer("Cluster viewer");
viewer.showCloud(colored_cloud);
while (!viewer.wasStopped()) {
}
std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clusters_pcl;
 for (int i = 0; i < clusters.size(); ++i) {
 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_cluster(
 new pcl::PointCloud<pcl::PointXYZRGB>);
 cloud_cluster->width = clusters[i].indices.size();
 cloud_cluster->height = 1;
 cloud_cluster->is_dense = true;
 for (int j = 0; j < clusters[i].indices.size(); ++j) {
 //Take the corresponding point of the filtered cloud from the indices for the new pcl
 cloud_cluster->push_back(
 point_cloud_ptr->at(clusters[i].indices[j]));
 }
 indices2.clear();
 //pcl::removeNaNFromPointCloud(*cloud_cluster, *cloud_cluster, indices2);
 clusters_pcl.push_back(cloud_cluster);
 }

return clusters_pcl;
}

2 个答案:

答案 0 :(得分:0)

试试这段代码:

    pcl::ExtractIndices<pcl::PointXYZRGB> extract;
    std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> output_clouds;  //vector of point clouds that will hold the cluster clouds

    for (int i = 0; i < clusters.size(); ++i){
        upcloud cloud_temp(new pcl::PointCloud<pcl::PointXYZRGB>);

        //extract the cloud from the cluster indicies
        extract.setInputCloud(input_cloud);
        pcl::PointIndices cluster = clusters[i];
        boost::shared_ptr<pcl::PointIndices> indicies = boost::make_shared<pcl::PointIndices>(cluster);
        extract.setIndices(indicies);
        extract.setNegative(false);
        extract.filter(*cloud_temp);

        output_clouds.push_back(cloud_temp);
    }

答案 1 :(得分:0)

所以我只想出来,太简单了,我看不到它;抱歉。 当我将点复制到集群中时,我使用原始点云而不是过滤点云。也许作为结果,我甚至没有想到这一点。

所以这个:

cloud_cluster->push_back(
                point_cloud_ptr->at(clusters[i].indices[j]));

必须替换为:

cloud_cluster->push_back(
                cloud_filtered->at(clusters[i].indices[j]));

干杯