K-means聚类点云数据

时间:2017-09-05 11:51:05

标签: c++ k-means point-cloud-library

我正在尝试在点云上实现K-means聚类算法。但是,我不确定如何导入数据作为pcl的k-means成员的输入。证明文件有点令人困惑。 到目前为止,我已将pcd导入点云并将其转移到矢量中,但我不知道如何从这里继续并直接初始化Kmeans。

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

    std::vector<pcl::PointXYZ> cloud;
    pcl::io::loadPCDFile ("Scene02 - Cloud.pcd", *cloud_in);

    for (int i = 0; i < cloud_in->size(); i++)
    {
        cloud[i] = cloud_in->points[i];
    }

    pcl::Kmeans real(300000, 3); 
    real.setInputData(cloud);



 }

我意识到语法错误但我不确定正确的是什么。

1 个答案:

答案 0 :(得分:1)

与pcl通常的做法(以自定义点类型为中心)相比,这个函数非常奇怪。基本上,奇怪的是你必须通过指定的维度向量而不是自定义点类型输入点。这是经过测试和功能的示例代码:(显然,您需要提供自己的文件名,并且您可能希望调整群集大小)

int main(int argc, char** argv) {

    std::string filePath = "../PointCloudFiles/beaconJR.pcd";
    pcl::PointCloud<pcl::PointXYZ>::Ptr tempCloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile(filePath, *tempCloud) == -1) //* load the file
    {printf("failed file load!\n");}
    else
    {
        pcl::Kmeans real(static_cast<int> (tempCloud->points.size()), 3);
        real.setClusterSize(3); //it is important that you set this term appropriately for your application
        for (size_t i = 0; i < tempCloud->points.size(); i++)
        {
            std::vector<float> data(3);
            data[0] = tempCloud->points[i].x;
            data[1] = tempCloud->points[i].y;
            data[2] = tempCloud->points[i].z;
            real.addDataPoint(data);
        }

        real.kMeans();
        // get the cluster centroids 
        pcl::Kmeans::Centroids centroids = real.get_centroids();
        std::cout << "points in total Cloud : " << tempCloud->points.size() << std::endl;
        std::cout << "centroid count: " << centroids.size() << std::endl;
        for (int i = 0; i<centroids.size(); i++)
        {
            std::cout << i << "_cent output: x: " << centroids[i][0] << " ,";
            std::cout << "y: " << centroids[i][1] << " ,";
            std::cout << "z: " << centroids[i][2] << std::endl;
        }
    }

    std::cin.get();
    std::cin.get();
}

干杯!

- 修改

就可视化群集而言。我认为(未经测试)&#34; pcl :: Kmeans :: PointsToClusters&#34;将为您提供一个带有每个点的custer标签的向量,您可以使用它来索引原始云并将它们分开。