首先依據點的曲率值對點進行排序,之所以排序,是因為區域生長演算法是從曲率最小的點開始生長的,這個點就是初始種子點,初始種子點所在的區域即為最平滑的區域,從最平滑的區域開始生長可減少分割片段的總數,提高效率。
演算法流程總結:
種子周圍的臨近點和種子點雲相比較
法線的方向是否足夠相近
曲率是否足夠小
如果滿足2,3則該點可用做種子點
如果只滿足2,則歸類而不做種子點
從某個種子出發,其「子種子」不再出現則一類聚集完成
類的規模既不能太大也不能太小
**展示:
#include #include #include #include #include #include #include #include #include #include typedef pcl::pointxyz pointt;
int main ( )
//設定搜尋的方式
pcl::search::search::ptr tree(new pcl::search::kdtree);
//求法線
pcl::pointcloud ::ptr normals (new pcl::pointcloud );
pcl::normalestimationnormal_estimator;
normal_estimator.setsearchmethod (tree);
normal_estimator.setinputcloud (cloud);
normal_estimator.setksearch (50);
normal_estimator.compute (*normals);
//直通濾波在z軸的0到1公尺之間
pcl::indicesptr indices (new std::vector );
pcl::passthroughpass;
pass.setinputcloud (cloud);
pass.setfilterfieldname ("z");
pass.setfilterlimits (0.0, 1.0);
pass.filter (*indices);
//聚類物件《點,法線》
pcl::regiongrowingreg;
reg.setminclustersize (5000); //最小的聚類的點數
reg.setmaxclustersize (1000000); //最大的聚類的點數
reg.setsearchmethod (tree); //搜尋方式
reg.setnumberofneighbours (30); //設定搜尋的鄰域點的個數
reg.setinputcloud (cloud); //輸入點
(indices);
reg.setinputnormals (normals); //輸入的法線
reg.setsmoothnessthreshold (3.0 / 180.0 * m_pi); //設定平滑度
reg.setcurvaturethreshold (1.0); //設定曲率的閥值
// 獲取聚類的結果,分割結果儲存在點雲索引的向量中
std::vector clusters;
reg.extract (clusters);
//輸出聚類的數量
std::cout << "number of clusters is equal to " << clusters.size () << std::endl;
// 輸出第乙個聚類的數量
std::cout << "first cluster has " << clusters[0].indices.size () << " points." << endl;
std::cout << "these are the indices of the points of the initial" <<
std::endl << "cloud that belong to the first cluster:" << std::endl;
int counter = 0;
while (counter < clusters[0].indices.size ())
std::cout << std::endl;
//視覺化聚類的結果
pcl::pointcloud ::ptr colored_cloud = reg.getcoloredcloud ();
pcl::visualization::cloudviewer viewer ("cluster viewer");
viewer.showcloud(colored_cloud);
while (!viewer.wasstopped ())
return (0);
}
效果展示:
區域生長法分割
區域生長法的基本思想就是將具有相似性的畫素集合起來形成乙個區域。具體做法就是,首先選擇乙個種子點,通過比較種子點鄰域的相似性,將鄰域中滿足相似性準則的畫素歸入種子點所在的區域,然後將這新的畫素點定為種子點,重複上述過程,直到沒有滿足相似性準則的新的鄰域畫素點產生為止。通過區域生長,乙個區域就形成了。...
區域生長分割點雲
include include include include include include include include include include intmain int argc,char argv pcl search search pointxyz ptr tree boost s...
PCL點雲庫 區域增長分割
區域生長演算法是利用了法線 曲率和顏色等資訊來判斷點雲是否應該聚成一類,適用於特徵均勻的連通目標。通過設定的約束條件並結合分割資料的融合需求,利用場景中物體的特徵將不同的目標物體從場景中分割出來。pcl中呼叫區域生長分割類pcl regiongrowing,實現區域生長分割演算法,演算法的目標是按照...