io獲取 pcl 點雲資料視覺化之PCL濾波學習

2021-10-14 01:39:40 字數 3792 閱讀 9350

在獲取點雲資料時 ,由於裝置精度,操作者經驗環境因素帶來的影響,以及電磁波的衍射特性,被測物體表面性質變化和資料拼接配準操作過程的影響,點雲資料中將不可避免的出現一些雜訊。在點雲處理流程中濾波處理作為預處理的第一步,對後續的影響比較大,只有在濾波預處理中將雜訊點 ,離群點,孔洞,資料壓縮等按照後續處理定製,才能夠更好的進行配準,特徵提取,曲面重建,視覺化等後續應用處理,pcl中點雲濾波模組提供了很多靈活實用的濾波處理演算法,例如:passthrough直通濾波、voxelgrid過濾、statisticaloutlierremoval過濾、點雲投影、提取索引等;下面將對幾種常見濾波進行介紹。

pcl中總結了幾種需要進行點雲濾波處理情況,這幾種情況分別如下:

(1) 點雲資料密度不規則需要平滑

(2) 因為遮擋等問題造成離群點需要去除

(3) 大量資料需要下取樣

(4) 雜訊資料需要去除

對應的方案如下:

(1)按照給定的規則限制過濾去除點

(2) 通過常用濾波演算法修改點的部分屬性

(3)對資料進行下取樣

直通濾波:快速過濾掉使用者自定義區間範圍內的點雲,效果最為明顯並且也最容易理解。

體素濾波:在分割、配準前,如果點雲數量太多會影響後續時間。此時,需要對點雲進行下取樣處理,體素濾波為採用體素網格方法取樣,減少點雲數量。

統計濾波:統計濾波往往去除離群點,利用統計分析技術刪除雜訊異常值等。

投影點雲:將點投影到乙個引數化模型上(平面或者球體等)。

提取索引:基於某一分割演算法提取點雲中的子集。

對於下面各種濾波的使用並沒有只用文本來闡述,而是主要在**的注釋中,我認為這樣會便於理解。

直通濾波

直通濾波通俗來講就是設定乙個範圍,經該範圍內或者該範圍外的點雲資料剔除,是一種簡單暴力但效果明顯的方式。

**:

#include #include #include #include #include int main (int argc, char** ar**)  return (0);}
處理前:

處理後:

這種濾波處理方式效果很明顯,但是它受限於取樣裝置的角度,如果角度不佳,僅僅對xyz軸方向進行過濾就得不到理想的結果。

體素濾波

使用體素化網格方法實現下取樣,即減少點的數量 減少點雲資料,並同時儲存點雲的形狀特徵,在提高後期點雲處理速度方面將起到顯著效果。pcl是實現的voxelgrid類通過輸入的點雲資料建立乙個三維體素柵格,容納後每個體素內用體素中所有點的重心來近似顯示體素中其他點,這樣該體素內所有點都用乙個重心點最終表示,對於所有體素處理後得到的過濾後的點雲,這種方法比用體素中心逼近的方法更慢,但是對於取樣點對應曲面的表示更為準確。

**:

#include #include #include #include #include #include int main (int argc, char** ar**)  return (0);}
處理前:

處理後:

統計濾波

使用統計分析技術,從乙個點雲資料中集中移除測量雜訊點(也就是離群點)比如:雷射掃瞄通常會產生密度不均勻的點雲資料集,另外測量中的誤差也會產生稀疏的離群點,使效果不好,估計區域性點雲特徵(例如取樣點處法向量或曲率變化率)的運算複雜,這會導致錯誤的數值,反過來就會導致點雲配準等後期的處理失敗。

解決辦法:每個點的鄰域進行乙個統計分析,並修剪掉一些不符合一定標準的點,稀疏離群點移除方法基於在輸入資料中對點到臨近點的距離分布的計算,對每乙個點,計算它到它的所有臨近點的平均距離,,假設得到的結果是乙個高斯分布,其形狀是由均值和標準差決定,平均距離在標準範圍之外的點,可以被定義為離群點並可從資料中去除。

**:

#include #include #include #include #include #include #include int main (int argc, char** ar**)  return (0);}
處理前:

處理後:

統計濾波我目前的理解是通過演算法按照一定閾值將點雲中的可能存在干擾的離散點過濾掉。

點雲投影

點雲投影主要是將三維結構投影到二維平面上。

#include #include #include #include #include #include #include #include #include int main (int argc, char** ar**)  return (0);}
處理前:

處理後:

這裡就變成了乙個在x-z平面的二維投影。

提取索引

**:

#include #include #include #include #include #include #include #include #include #include int main (int argc, char** ar**)    // extract the inliers    extract.setinputcloud (cloud_filtered);    extract.setindices (inliers);    extract.setnegative (false);    extract.filter (*cloud_p);    std::stringstream ss;    ss << "table_scene_lms400_plane_" << i << ".pcd";    writer.write<:pointxyz> (ss.str (), *cloud_p, false);    // create the filtering object    extract.setnegative (true);    extract.filter (*cloud_f);    cloud_filtered.swap (cloud_f);    i++;  }  //處理後點雲顯示  pcl::visualization::cloudviewer viewer("pcl濾波");  viewer.showcloud(cloud_f);  while (!viewer.wasstopped())  return (0);}
處理前:

處理後:

PCL視覺化顯示點雲

1 引用 僅僅是簡單的顯示點雲,可以使用cloudviewer類。這個類非常簡單易用。但要注意,它不是執行緒安全的。如果要用於多執行緒,還要參考pclvisualizer。需要注意的是,pointcloud的資料型別要和pcd檔案中或者 中的pointt一致!並且 cloudviewer除了顯示什麼...

求助帖,pcl 點雲視覺化。

我自己整理了一段視覺化的 想的以後可以直接用很方便,但出現了一點問題,請各位路過的到有幫忙解答。實現的功能 如果命令列輸入乙個點雲,則視覺化這個點雲 如果輸入兩個,則在同乙個視窗顯示這兩個點雲。問題 執行的時候,如果輸入兩個點雲是沒毛病的,但只輸入乙個 點雲時顯示不出來。下面是 include in...

PCL點雲視覺化及濾波處理

看pcl已經有一段時間了,慢慢有了一點感悟和積累,想把自己的學習經歷記錄下來。下面這一段程式是用來進行點雲視覺化和使用voxelgrid濾波器對點雲進行下取樣處理的 include include include include include include std stringstream ss...