區域生長演算法是利用了法線、曲率和顏色等資訊來判斷點雲是否應該聚成一類,適用於特徵均勻的連通目標。通過設定的約束條件並結合分割資料的融合需求,利用場景中物體的特徵將不同的目標物體從場景中分割出來。pcl中呼叫區域生長分割類pcl::regiongrowing,實現區域生長分割演算法,演算法的目標是按照平滑一致性約束條件合併足夠近的點,因此演算法的輸出是一組集群,且每個集群上的點位於同乙個光滑表面。該演算法是一種基於點的法線角度差的分割,通過比較種子點與其鄰域點之間的法線夾角,將小於平滑閾值(人為設定)的作為同一平滑曲面的部分。
演算法步驟:依據點雲的曲率值對輸入點雲進行排序,選擇曲率最小的點作為初始種子點,因為該點所在的區域即為最平滑的區域,從最平滑的區域開始生長可減少分割片段的總數,提高分割效率。初始化乙個空的種子點序列和空的聚類區域,從排序後的點雲中選好初始種子點新增到種子點序列中,並搜尋其鄰域點,比較每乙個鄰域點與當前種子點之間的法線夾角,若所得結果小於平滑閾值(smoothnessthreshold),則將當前點新增到當前區域,若該鄰域點曲率小於曲率閾值(curvaturethreshold,人為設定),則將其加入到種子點序列中,刪除當前種子點,迴圈執行上述步驟,直到種子序列為空。
以下例項實現了pcl中的區域增長分割,將分割後的點雲按不同顏色顯示出來,儲存了分割後的各片點雲與各片點雲的質心。
//****區域增長分割****//
#include
#include
#include
#include
#include
#include
#include
//cstring標頭檔案
using
namespace std;
intmain (
int argc,
char
** ar**)
//視覺化
pcl::visualization::pclvisualizer viewer
("pclvisualizer");
viewer.
initcameraparameters()
;intv1(
0); viewer.
createviewport
(0.0
,0.0
,0.5
,1.0
, v1)
; viewer.
setbackgroundcolor
(128.0
/255.0
,138.0
/255.0
,135.0
/255.0
, v1)
; viewer.
addtext
("cloud before segmenting",10
,10,"v1 test"
, v1)
; viewer.addpointcloud<:pointxyz>
(cloud,
"cloud"
, v1)
;intv2(
0); viewer.
createviewport
(0.5
,0.0
,1.0
,1.0
, v2)
; viewer.
setbackgroundcolor
(128.0
/255.0
,138.0
/255.0
,135.0
/255.0
, v2)
; viewer.
addtext
("cloud after segmenting",10
,10,"v2 test"
, v2)
; ofstream fout;
//寫入檔案流
fout.
open
("rgcentroid.txt");
for(
int i =
0; i < regiongrow.
size()
; i++
) fout.
close()
;//關閉檔案。
儲存下來的各片點雲與點雲質心檔案如下所示:
基於區域增長的點雲分割
region growing segmentation 基於區域增長的點雲分割 pcl regiongrowing 該類在pcl 1.7.0才有的 pcl normalestimation 計算法向量 演算法思路 選擇種子點 在當前點集a中選擇有最小曲率的點加入種子點集 區域增長 尋找種子點的鄰域點...
區域生長分割點雲
include include include include include include include include include include intmain int argc,char argv pcl search search pointxyz ptr tree boost s...
PCL之區域生長分割
首先依據點的曲率值對點進行排序,之所以排序,是因為區域生長演算法是從曲率最小的點開始生長的,這個點就是初始種子點,初始種子點所在的區域即為最平滑的區域,從最平滑的區域開始生長可減少分割片段的總數,提高效率。演算法流程總結 種子周圍的臨近點和種子點雲相比較 法線的方向是否足夠相近 曲率是否足夠小 如果...