效果:
代码:
#include <iostream>
#include <vector>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h> // 各种点云数据类型
#include <pcl/search/search.h>
#include <pcl/search/kdtree.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/filters/filter_indices.h> // for pcl::removeNaNFromPointCloud
#include <pcl/segmentation/region_growing.h>int main(){pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>());if( pcl::io::loadPCDFile<pcl::PointXYZ>("/home/lrj/work/pointCloudData/table_scene_lms400.pcd", *cloud) == -1){std::cout << "cloud reading failed.\n";return (-1);}pcl::search::Search<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> normal_estimator;normal_estimator.setSearchMethod(tree);normal_estimator.setInputCloud(cloud);normal_estimator.setKSearch(50);normal_estimator.compute(*normals);pcl::IndicesPtr indices(new std::vector<int>);pcl::removeNaNFromPointCloud(*cloud, *indices);pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg;reg.setMaxClusterSize(50);reg.setMaxClusterSize(1000000);reg.setSearchMethod(tree);reg.setNumberOfNeighbours(30);reg.setInputCloud(cloud);reg.setIndices(indices);reg.setInputNormals(normals);reg.setSmoothnessThreshold(3.0 / 180.0 * M_PI);reg.setCurvatureThreshold(1.0);std::vector<pcl::PointIndices> clusters;reg.extract(clusters);std::cout << "Number of cluster is equal to " << clusters.size() << std::endl;std::cout << "First cluster has " << clusters[0].indices.size() << " points." << std::endl;std::cout << "These are the indices of the points of the initial" << std::endl<< "cloud thar belong to the first cluster:" << std::endl;std::size_t counter = 0;while (counter < clusters[0].indices.size()){std::cout << clusters[0].indices[counter] << ", ";counter++;if(counter % 10 == 0)std::cout << std::endl;}std::cout << std::endl;pcl::PointCloud<pcl::PointXYZRGB>::Ptr colored_cloud = reg.getColoredCloud();pcl::visualization::CloudViewer viewer("cluster viewer");viewer.showCloud(colored_cloud);while(!viewer.wasStopped()){}return(0);}