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

int main (int argc, char** argv) { // Load input file pcl::PointCloudpcl::PointXYZRGB::Ptr cloud (new pcl::PointCloudpcl::PointXYZRGB); pcl::PCDReader reader; reader.read ('input_cloud.pcd', *cloud);

// Downsample input cloud pcl::VoxelGridpcl::PointXYZRGB sor; sor.setInputCloud (cloud); sor.setLeafSize (0.01f, 0.01f, 0.01f); sor.filter (*cloud);

// Estimate normals for input cloud pcl::NormalEstimationOMP<pcl::PointXYZRGB, pcl::Normal> ne; ne.setInputCloud (cloud); pcl::search::KdTreepcl::PointXYZRGB::Ptr tree (new pcl::search::KdTreepcl::PointXYZRGB); ne.setSearchMethod (tree); pcl::PointCloudpcl::Normal::Ptr normals (new pcl::PointCloudpcl::Normal); ne.setRadiusSearch (0.03); ne.compute (*normals);

// Perform region growing segmentation pcl::RegionGrowing<pcl::PointXYZRGB, pcl::Normal> rg; rg.setInputCloud (cloud); rg.setInputNormals (normals); rg.setMinClusterSize (50); rg.setMaxClusterSize (10000); rg.setSmoothnessThreshold (3.0 / 180.0 * M_PI); rg.setCurvatureThreshold (1.0); std::vector pcl::PointIndices clusters; rg.extract (clusters);

// Create PCL visualizer pcl::visualization::PCLVisualizer::Ptr viewer (new pcl::visualization::PCLVisualizer ('Cluster viewer'));

// Add input cloud to viewer viewer->addPointCloudpcl::PointXYZRGB (cloud, 'input_cloud');

// Add cluster centroids to viewer for (int i = 0; i < clusters.size (); i++) { pcl::PointCloudpcl::PointXYZRGB::Ptr cluster_cloud (new pcl::PointCloudpcl::PointXYZRGB); for (int j = 0; j < clusters[i].indices.size (); j++) { cluster_cloud->push_back ((*cloud)[clusters[i].indices[j]]); } cluster_cloud->width = cluster_cloud->size (); cluster_cloud->height = 1; cluster_cloud->is_dense = true; pcl::PointXYZRGB centroid; pcl::computeCentroid (*cluster_cloud, centroid); std::string centroid_id = 'centroid_' + std::to_string (i); viewer->addSphere (centroid, 0.02, 1.0, 0.0, 0.0, centroid_id); }

// Set viewer parameters viewer->setBackgroundColor (0.0, 0.0, 0.0); viewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, 'input_cloud');

// Start viewer viewer->spin ();

return 0; }

该代码使用了 PCL 库,实现了基于区域生长算法的点云聚类,并将每个聚类的质心点可视化为红色球体。输入点云文件为 input_cloud.pcd,输出为 PCL 可视化界面。具体实现过程见注释。

C++ 代码:点云聚类质心点可视化

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

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