PCL聚类并显示 代码
时间: 2024-05-04 18:17:49 浏览: 164
聚类算法的代码
以下是使用 PCL 进行点云聚类并显示的示例代码:
```cpp
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/features/normal_3d.h>
#include <pcl/kdtree/kdtree.h>
#include <pcl/segmentation/extract_clusters.h>
#include <pcl/visualization/cloud_viewer.h>
int main () {
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
// 读取点云数据
pcl::io::loadPCDFile("input_cloud.pcd", *cloud);
// 对点云进行下采样
pcl::VoxelGrid<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
sor.setLeafSize(0.01f, 0.01f, 0.01f);
sor.filter(*cloud_filtered);
// 计算法线
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
ne.setInputCloud(cloud_filtered);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
ne.setSearchMethod(tree);
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
ne.setRadiusSearch(0.03);
ne.compute(*cloud_normals);
// 创建点云聚类对象
pcl::ExtractClusters<pcl::PointXYZ> ec;
ec.setClusterTolerance(0.02);
ec.setMinClusterSize(100);
ec.setMaxClusterSize(25000);
ec.setSearchMethod(tree);
ec.setInputCloud(cloud_filtered);
// 聚类并可视化
std::vector<pcl::PointIndices> cluster_indices;
ec.extract(cluster_indices);
pcl::visualization::PCLVisualizer viewer("Cluster viewer");
viewer.setBackgroundColor(0, 0, 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_filtered->points[*pit]);
}
cluster_cloud->width = cluster_cloud->points.size();
cluster_cloud->height = 1;
cluster_cloud->is_dense = true;
// 随机生成颜色
unsigned char r = rand() % 256;
unsigned char g = rand() % 256;
unsigned char b = rand() % 256;
// 可视化聚类结果
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color(cluster_cloud, r, g, b);
viewer.addPointCloud<pcl::PointXYZ>(cluster_cloud, color, "cluster" + std::to_string(it - cluster_indices.begin()));
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cluster" + std::to_string(it - cluster_indices.begin()));
}
// 显示点云
viewer.addPointCloud<pcl::PointXYZ>(cloud_filtered, "cloud");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud");
// 设置相机视角
viewer.setCameraPosition(-16.2, -16.5, 24.2, 0.5, 0.5, 0.5, 0, 0, 1);
// 进入可视化循环
while (!viewer.wasStopped()) {
viewer.spinOnce();
}
return 0;
}
```
这段代码首先使用 `pcl::io::loadPCDFile` 函数读取点云数据,然后使用 `pcl::VoxelGrid` 对点云进行下采样,使用 `pcl::NormalEstimation` 计算法线。接着,使用 `pcl::ExtractClusters` 对点云进行聚类,并将聚类结果可视化。最后,使用 `pcl::visualization::PCLVisualizer` 将点云和聚类结果显示出来。
需要注意的是,本例中聚类算法的参数是根据具体场景进行调整的,不同的场景可能需要不同的参数。
阅读全文