在獲取點雲資料時 ,由於裝置精度,操作者經驗環境因素帶來的影響,以及電磁波的衍射特性,被測物體表面性質變化和資料拼接配準操作過程的影響,點雲資料中講不可避免的出現一些雜訊。在點雲處理流程中濾波處理作為預處理的第一步,對後續的影響比較大,只有在濾波預處理中將雜訊點 ,離群點,孔洞,資料壓縮等按照後續處理定製,才能夠更好的進行配準,特徵提取,曲面重建,視覺化等後續應用處理,pcl中點雲濾波模組提供了很多靈活實用的濾波處理演算法,例如:雙邊濾波,高斯濾波,條件濾波,直通濾波,基於隨機取樣一致性濾波,
pcl中點雲濾波的方案
pcl中總結了幾種需要進行點雲濾波處理情況,這幾種情況分別如下:
(1) 點雲資料密度不規則需要平滑
(2) 因為遮擋等問題造成離群點需要去除
(3) 大量資料需要下取樣
(4) 雜訊資料需要去除
對應的方案如下:
(1)按照給定的規則限制過濾去除點
(2) 通過常用濾波演算法修改點的部分屬性
(3)對資料進行下取樣
雙邊濾波演算法是通過取臨近取樣點和加權平均來修正當前取樣點的位置,從而達到濾波效果,同時也會有選擇剔除與當前取樣點「差異」太大的相鄰取樣點,從而保持原特徵的目的
1、直通濾波( passthrough )
class pcl: : passthrough< pointt >
類 passthrough 實現對使用者給定點雲某個欄位的限定下,對點雲進行簡單的基本過濾,例如限制過濾掉點雲中所有 x 欄位不在某個範圍內的點,該類的使用比較靈活但完全取決於使用者的限定欄位和對應條件 。
關鍵成員函式:
void setfilterfieldname (const std : :string &field_name)
設定限定欄位的名稱字串 field_name ,例如」z」等。
void setfilterlimits (const double &limit_min, const double & limit_max)
設定濾波限制條件,包括最小值 limit_min 和最大值 limit_max。 該函式與 setfilterfieldname( )一起使用,點雲中所有點的setfilterfieldname( )設定的字段的值未在使用者所設定區間範圍外的點將被刪除。引數 limit_min 為允許的區間範圍的最小值,預設為 dbl_ min , limit_ max 為允許的區間範圍的最大值,預設為db l_max.
void setfilterlimitsnegative (bool &!imit_negative):
設定返回濾波限制條件外的點還是內部點, limit_negative 預設值為 false,輸出點雲為在設定欄位的設定範圍內的點集,如果設定為 true 則剛好相反 。 警告:該方法將來將會被移除,用 setnegative( )函式代替。
#include
#include
#include
#include
int main (
int argc,
char
** ar**)
std::cerr <<
"cloud before filtering: "
<< std::endl;
for(size_t i =
0; i < cloud-
>points.size ();
++i)
std::cerr <<
" "
<< cloud-
>points[i]
.x <<
" "<< cloud-
>points[i]
.y <<
" "<< cloud-
>points[i]
.z << std::endl;
/* 建立直通濾器物件,設立它的引數,濾波欄位名被設為 z 軸方向,
可接受的範圍設為是(0.0, 1.0),即將點雲中所有點的 z 座標不在該範圍內的點過濾掉或保留,
這裡是過濾掉,由函式setfilterlimitsnegative設定。
*/pcl::passthrough pass;
//設定濾波器物件
pass.setinputcloud (cloud)
;//設定輸入點雲
pass.setfilterfieldname (
"z")
;//設定過濾時所需要點雲型別的z欄位
pass.setfilterlimits (
0.0,
1.0)
;//設定在過濾欄位上的範圍
(false);//設定保留範圍內的還是過濾掉範圍內的:演算法內部預設false,即保留範圍內的,濾掉範圍外的;若設為true,則保留範圍外的,濾掉範圍內的;
(true);//作用同setfilterlimitsnegative
pass.filter (
*cloud_filtered)
;//執行過濾,過濾結果在cloud_filtered
std::cerr <<
"cloud after filtering: "
<< std::endl;
for(size_t i =
0; i < cloud_filtered-
>points.size ();
++i)
std::cerr <<
" "
<< cloud_filtered-
>points[i]
.x <<
" "<< cloud_filtered-
>points[i]
.y <<
" "<< cloud_filtered-
>points[i]
.z << std::endl;
return(0
);}
cloud before filtering:
-0.488861
-0.159637
-0.184082
-0.0341187
-0.112793
-0.293701
-0.0905457
-0.410339
0.366943
0.0204468
0.286987
-0.243317
0.187744
-0.0695801
0.42627
cloud after filtering:
-0.0905457
-0.410339
0.366943
0.187744
-0.0695801
0.42627
PCL點雲直通濾波
對於在空間分布有一定空間特徵的點雲資料,比如使用線結構光掃瞄的方式採集點雲,沿z向分布較廣,但x,y向的分布處於有限範圍內。此時可使用直通濾波器,確定點雲在x或y方向上的範圍,可較快剪除離群點,達到第一步粗處理的目的。include include include int main int argc...
PCL 直通濾波器
二 示例 三 結果展示 直通濾波的作用是過濾掉在指定維度方向上取值不在給定值域內的點,實現原理如下 首先,指定乙個維度以及該維度下的值域,其次,遍歷點雲中的每個點,判斷該點在指定維度上的取值是否在值域內,刪除取值不在值域內的點,最後,遍歷結束,留下的點即構成濾波後的點雲。直通濾波器簡單高效,適用於消...
2 PCL濾波之直通濾波器
直通濾波器 對指定維度 x,y,z,bgr等 進行某乙個範圍濾波,可以刪除這個範圍內部點,也可以刪除這個範圍外部的點 函式 pcl passthroughpcl pointxyz pass 例項化直通濾波器 throughpass.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。in...