将点云聚类的质心点可视化的C++代码
以下是将点云聚类的质心点可视化的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库来进行点云聚类、质心点计算和可视化。具体步骤如下:
- 加载输入点云文件(PCD格式)。
- 对点云进行体素网格下采样,降低点云密度。
- 使用法线估计模块计算点云法线。
- 使用区域生长模块对点云进行聚类,得到每个聚类的索引。
- 对每个聚类,计算其质心点,并使用PCL可视化模块将其可视化。
其中,区域生长模块的参数可以根据实际情况进行调整,例如聚类的最大/最小大小、平滑度阈值、曲率阈值等
原文地址: https://www.cveoy.top/t/topic/ebW9 著作权归作者所有。请勿转载和采集!