pcl点云聚类方法
本節(jié)記錄下點(diǎn)云聚類方法
1.歐式聚類分割方法
//為提取點(diǎn)云時(shí)使用的搜素對(duì)象利用輸入點(diǎn)云cloud_filtered創(chuàng)建Kd樹對(duì)象tree。pcl::search::KdTree::Ptr tree (new pcl::search::KdTree); tree->setInputCloud (cloud_filtered);//創(chuàng)建點(diǎn)云索引向量,用于存儲(chǔ)實(shí)際的點(diǎn)云信息首先創(chuàng)建一個(gè)Kd樹對(duì)象作為提取點(diǎn)云時(shí)所用的搜索方法,再創(chuàng)建一個(gè)點(diǎn)云索引向量cluster_indices,用于存儲(chǔ)實(shí)際的點(diǎn)云索引信息,每個(gè)檢測(cè)到的點(diǎn)云聚類被保存在這里。請(qǐng)注意: cluster_indices是一個(gè)向量,對(duì)每個(gè)檢測(cè)到的聚類,它都包含一個(gè)索引點(diǎn)的實(shí)例,如cluster_indices[0]包含點(diǎn)云中第一個(gè)聚類包含的點(diǎn)集的所有索引。
std::vector<pcl::PointIndices> cluster_indices; pcl::EuclideanClusterExtraction ec; ec.setClusterTolerance (0.02); //設(shè)置近鄰搜索的搜索半徑為2cm ec.setMinClusterSize (100);//設(shè)置一個(gè)聚類需要的最少點(diǎn)數(shù)目為100 ec.setMaxClusterSize (25000); //設(shè)置一個(gè)聚類需要的最大點(diǎn)數(shù)目為25000 ec.setSearchMethod (tree);//設(shè)置點(diǎn)云的搜索機(jī)制 ec.setInputCloud (cloud_filtered); ec.extract (cluster_indices);//從點(diǎn)云中提取聚類,并將點(diǎn)云索引保存在cluster_indices中因?yàn)辄c(diǎn)云是PointXYZ類型的,所以這里用點(diǎn)云類型PointXYZ創(chuàng)建一個(gè)歐氏聚類對(duì)象,并設(shè)置提取的參數(shù)和變量。注意:設(shè)置一個(gè)合適的聚類搜索半徑ClusterTolerance,如果搜索半徑取一個(gè)非常小的值,那么一個(gè)實(shí)際的對(duì)象就會(huì)被分割為多個(gè)聚類;如果將值設(shè)置得太高,那么多個(gè)對(duì)象就會(huì)被分割為一個(gè)聚類,所以需要進(jìn)行測(cè)試找出最適合的ClusterTolerance。本例用兩個(gè)參數(shù)來限制找到的聚類:用setMinClusterSize()來限制一個(gè)聚類最少需要的點(diǎn)數(shù)目,用setMaXClusterSize()來限制最多需要的點(diǎn)數(shù)目。接下來我們從點(diǎn)云中提取聚類,并將點(diǎn)云索引保存在cluster_indices中。
為了從點(diǎn)云索引向量中分割出每個(gè)聚類,必須迭代訪問點(diǎn)云索引,每次創(chuàng)建一個(gè)新的點(diǎn)云數(shù)據(jù)集,并且將所有當(dāng)前聚類的點(diǎn)寫入到點(diǎn)云數(shù)據(jù)集中。
//迭代訪問點(diǎn)云索引cluster_indices,直到分割出所有聚類int j = 0;for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin (); it != cluster_indices.end (); ++it){pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_cluster (new pcl::PointCloud<pcl::PointXYZ>);//創(chuàng)建新的點(diǎn)云數(shù)據(jù)集cloud_cluster,將所有當(dāng)前聚類寫入到點(diǎn)云數(shù)據(jù)集中for (std::vector<int>::const_iterator pit = it->indices.begin (); pit != it->indices.end (); ++pit){cloud_cluster->points.push_back (cloud_filtered->points[*pit]);cloud_cluster->width = cloud_cluster->points.size ();cloud_cluster->height = 1;cloud_cluster->is_dense = true; }pcl::visualization::CloudViewer viewer("Cloud Viewer");viewer.showCloud(cloud_cluster);pause();} 保存每個(gè)cloud_cluster為單獨(dú)的.pcd文件,一個(gè)文件就是一個(gè)聚類 } }總結(jié)
- 上一篇: 基于halcon的形状匹配之人脸识别
- 下一篇: 高物实验报告计算机模拟高分子,高分子物理