PCL濾波器的學習筆記

2021-09-01 19:40:55 字數 3121 閱讀 2321

pcl提供了各種各樣的濾波器,我在學習使用pcl庫時簡單地使用過其中一些。因此,在這裡做個筆記。

在我看來,使用濾波器的過程為:建立濾波器 -> 設定輸入的點雲和濾波器引數 -> 執行濾波並獲得輸出結果。不同的濾波器除了需要設定不同的引數外,其他過程是一致的。想弄明白怎麼使用這些濾波器,可以先了解它們共有的方法。

一、濾波器的基類

在pcl庫中,濾波器繼承自乙個基類filter,這個基類定義了濾波器共有的操作方法。

上圖截自filter類的文件:這個告訴我們,filter繼承自pclbase類,是濾波器的基類。

filter類有乙個繼承自pclbase類的成員函式setinputcloud,我們可以通過這個函式把要濾波的點雲傳遞給filter:

virtual void 

setinputcloud (const pointcloudconstptr &cloud)

提供乙個指向點雲資料的指標

filter類定義了操作濾波器的函式:

indicesconstptr const 

getremovedindices () const

獲取被過濾的點索引。

void 

getremovedindices (pointindices &pi)

獲取被過濾的點索引。

void 

filter (pointcloud &output)

執行濾波操作,並將結果填入引數output。

二、部分濾波器介紹及使用

以下是一些被我使用過的濾波器的簡單介紹和demo**。

1、passthrough

過濾出給定範圍內的點雲。

pcl::pointcloud::ptr output(new pcl::pointcloud);

pcl::pointcloud::ptr output(new pcl::pointcloud);

......

//建立濾波器

pcl::passthroughptfilter;

//輸入要濾波的點雲

ptfilter.setinputcloud(input);

//選擇x軸方向進行濾波

ptfilter.setfilterfieldname("x");

//過濾掉x標軸座標在[-1.0, 1.0]範圍之外的點

ptfilter.setfilterlimits(-1.0, 1.0);

//true:濾波結果取反,過濾掉x標軸座標在[-1.0, 1.0]範圍之內的點

ptfilter.setnegative(false);

//獲取濾波結果

ptfilter.filter(*output);

2、extractindices根據給定的點雲中點的索引集合提取點雲,可結合pcl::sacsegmentation類(點雲分割)使用。

pcl::pointcloud::ptr output(new pcl::pointcloud);

pcl::pointcloud::ptr output(new pcl::pointcloud);

pcl::pointindices::ptr indices(new pcl::pointindices);

......

//建立濾波器

pcl::extractindice***tract;

//輸入要濾波的點雲

extract.setinputcloud(input);

//被提取的點的索引集合

extract.setindices(indices);

//true:濾波結果取反

extract.setnegative(false);

//獲取濾波結果

extract.filter(*output);

3、voxelgrid對點雲稀疏化(能保持點雲形狀和特徵)

pcl::pointcloud::ptr output(new pcl::pointcloud);

pcl::pointcloud::ptr output(new pcl::pointcloud);

......

//建立濾波器

pcl::voxelgridsor;

//輸入點雲

sor.setinputcloud (input);

//用0.1 x 0.2 x 0.3的立方體對點雲進行稀疏化

sor.setleafsize (0.1, 0.2, 0.3);

//獲得濾波結果

sor.filter (*output);

4、radiusoutlierremoval過濾掉點雲中的離群點,可去除點雲中的雜訊點

pcl::pointcloud::ptr output(new pcl::pointcloud);

pcl::pointcloud::ptr output(new pcl::pointcloud);

......

//建立濾波器

pcl::radiusoutlierremovalrorfilter;

//輸入點雲

rorfilter.setinputcloud(inpt);

//在0.5為半徑的範圍內搜尋鄰居點

rorfilter.setradiussearch(0.5);

//鄰居少於3個的點認為是離群點

rorfilter.setminneighborsinradius (3);

//獲取濾波結果

rorfilter.filter (*output);

以上是我用過的pcl庫的濾波器的彙總,而**所表達的都是最基本的用法,實際的介面比demo更加豐富,可以從濾波器的文件中查閱。此外,這只是pcl庫提供的濾波器的一部分,還有更多濾波器等待著探索,到時候再回來更新。

大家如果發現問題,希望多多指正!

PCL 直通濾波器

二 示例 三 結果展示 直通濾波的作用是過濾掉在指定維度方向上取值不在給定值域內的點,實現原理如下 首先,指定乙個維度以及該維度下的值域,其次,遍歷點雲中的每個點,判斷該點在指定維度上的取值是否在值域內,刪除取值不在值域內的點,最後,遍歷結束,留下的點即構成濾波後的點雲。直通濾波器簡單高效,適用於消...

PCL 統計濾波器

二 實現 三 結果展示 四 cloudcompare 雷射掃瞄通常會產生密度不均勻的點雲資料集,另外測量中的誤差也會產生稀疏的離群點,此時,估計區域性點雲特徵 例如取樣點處法向量或曲率變化率 時運算複雜,這會導致錯誤的數值,反過來就會導致點雲配準等後期的處理失敗。統計濾波器用於去除明顯離群點,離群點...

PCL體素濾波器

二 實現 三 結果展示 點雲幾何結構 不僅是巨集觀的幾何外形,也包括其微觀的排列方式,比如橫向相似的尺寸,縱向相同的距離。如果使用高解析度相機等裝置對點雲進行採集,往往點雲會較為密集。過多的點雲數量會對後續分割工作帶來困難。體素格濾波器可以達到向下取樣同時不破壞點雲本身幾何結構的功能。隨機下取樣雖然...