PCL學習筆記:點雲濾波匯總


轉載自:https://blog.csdn.net/weixin_46098577/article/details/114385690

PCL中點雲濾波模塊提供了很多靈活實用的濾波處理算法,例如:直通濾波、統計濾波、雙邊濾波、高斯濾波、基於隨機采樣一致性濾波等。同時,PCL中總結了幾種需要進行點雲濾波處理的情況,如下:

    點雲數據密度不規則需要平滑
    因遮擋等問題噪聲的離群點需要去除
    數據冗余需要下采樣
    噪聲數據需要去除

對應的方法如下:

    按具體給定的規則過濾點
    通過濾波算法修改點的部分屬性
    點雲數據下采樣

下面對PCL各種濾波方法做一些歸納總結,方便日后使用。

一、直通濾波

針對點雲某一維度,去掉指定范圍內(或外)的點。

流程:讀入點雲→創建濾波器對象→設置濾波字段范圍→執行濾波→保存濾波結果

#include <pcl/filters/passthrough.h>

 



二、VoxelGrid體素濾波器

對點雲數據創建一個三維體素柵格(微小的空間三維立方體的集合),用每個體素重心近似代替體素中的其他點。這種方法比用體素中心來逼近的方法更慢,但它對於采樣點對應曲面的表示更為准確。

流程:讀入點雲→創建濾波器對象→設置體素大小→執行濾波→保存濾波點雲

#include <pcl/filters/voxel_grid.h

濾波前后對比

 

 

三、UniformSampling均勻采樣

對點雲數據創建一個三維體素柵格,然后,在每個體素保留一個最接近體素中心的點,代替體素中所有點。

流程:讀入點雲→創建濾波器對象→設置濾波球體半徑→執行濾波→保存濾波點雲

#include <pcl/keypoints/uniform_sampling.h>
濾波前后對比

 

 

四、StatisticalOutlierRemoval統計濾波器

對每一點的鄰域進行統計分析,基於點到所有鄰近點的距離分布特征,過濾掉一些不滿足要求的離群點。該算法對整個輸入進行兩次迭代:在第一次迭代中,它將計算每個點到最近k個近鄰點的平均距離,得到的結果符合高斯分布。接下來,計算所有這些距離的平均值 μ 和標准差 σ 以確定距離閾值 thresh_d ,且 thresh_d = μ ± k·σ。 k為標准差乘數。在下一次迭代中,如果這些點的平均鄰域距離分別低於或高於該閾值,則這些點將被分類為內點或離群點。

流程:讀入點雲→創建濾波器對象→設置離群點閾值→執行統計濾波→保存濾波點雲

#include <pcl/filters/statistical_outlier_removal.h>
濾波前后對比

 

 

五、RadiusOutlierRemoval半徑濾波器

對整個輸入迭代一次,對於每個點進行半徑R鄰域搜索,如果鄰域點的個數低於某一閾值,則該點將被視為噪聲點並被移除。

流程:讀入點雲→創建半徑濾波器對象→設置離群點閾值→執行下采樣→保存采樣結果

#include <pcl/filters/radius_outlier_removal.h>
濾波前后對比

 

 

 

六、ConditionRemoval條件濾波器

篩選滿足特定條件的點雲數據。有兩種類型的條件:

 ConditionAnd: 所有條件都要滿足
ConditionOr: 滿足一個條件即可

可以設置一個或多個條件對象,並為條件對象添加比較算子。條件比較算子包含三項:

(1)名稱:對應於點雲XYZ字段名稱、RGB顏色空間、HSI顏色空間中的顏色分量等。
(2) 比較運算符:GT、GE、LT、LE、EQ

運算符    含義
GT    greater than 大於
GE    greater than or equal 大於等於
LT    less than 小於
LE    less than or equal 小於等於
EQ    equal 等於
比較運算符源碼

switch (this->op_)
  {
    case pcl::ComparisonOps::GT :
      return (compare_result > 0);
    case pcl::ComparisonOps::GE :
      return (compare_result >= 0);
    case pcl::ComparisonOps::LT :
      return (compare_result < 0);
    case pcl::ComparisonOps::LE :
      return (compare_result <= 0);
    case pcl::ComparisonOps::EQ :
      return (compare_result == 0);
    default:
      PCL_WARN ("[pcl::FieldComparison::evaluate] unrecognized op_!\n");
      return (false);
  }

值:即要比較的名稱的數值

流程:讀入點雲→創建條件對象→添加比較算子→創建條件限定下的濾波器對象→執行濾波→保存濾波結果

#include <pcl/filters/conditional_removal.h>
濾波前后對比

setKeepOrganized(true) 解釋:

保持點雲結構,即有序點雲經過濾波后,仍能夠保持有序性。

setKeepOrganized默認false,即直接將濾除的點刪除,從而可能改變點雲的組織結構。is_dense: 1

若設置為true,再通過setuserFilterValue設置一個指定的值,被濾除的點將會被該值代替;不進行setuserFilterValue設置,則默認用nan填充被濾除的點。is_dense: 0; 

七、ExtractIndices索引提取

從原始點雲中提取一組索引對應的點雲子集,前提是要獲取點雲索引集合。

流程:讀入點雲→平面分割獲取索引集合→創建點雲索引提取對象→執行索引提取→保存提取點雲

#include <pcl/filters/extract_indices.h>
濾波前后對比

 

八、投影濾波器

將點投影到一個參數化模型上,這個參數化模型可以是平面、圓球、圓柱、錐形等進行投影濾波。

參數化模型投影點雲,以平面投影為例:讀入點雲→創建參數化模型→設置模型系數→執行投影濾波→保存投影點雲

#include <pcl/filters/project_inliers.h>

投影前后對比

 

九、ModelOutlierRemoval模型濾波器

根據點到模型的距離,設置距離閾值過濾非模型點

流程:讀入點雲→設置模型系數→創建模型濾波器對象→執行模型濾波→保存濾波結果

濾波前后對比

 

十、空間裁剪濾波

10.1 CropHull濾波器

獲取點雲在 3D 封閉曲面上或 2D 封閉多邊形內或外部的點。

流程:讀入點雲→設置封閉范圍頂點→創建凸包對象→執行CropHull濾波→保存濾波點雲

需要注意的是 ,setDimension()和CH.setDim()的維度應保持一致

    當維度設置為2時,封閉區域為2D封閉多邊形,只有X和Y兩個維度。因此,該封閉多邊形在三維空間中表示為垂直於XOY面的豎直曲面。得到的是曲面內部或外部的點雲。
    當維度設置為3時,封閉區域為3D封閉曲面,僅得到位於該封閉曲面上的點。

十一 、BilateralFilter 雙邊濾波器

class pcl::BilateralFilter< PointT > 類BilateralFilter是對雙邊濾波算法在點雲上的實現,該類的實現利用的並非XYZ字段的數據進行,而是利用強度數據進行雙邊濾波算法的實現,所以在使用該類時點雲的類型必須有強度字段,否則無法進行雙邊濾波處理(所以在用這個函數的時候是需要注意自己輸入點雲的數據格式的,需要包含點雲的強度信息)
#include <pcl/filters/bilateral.h>
注:只是代碼跑通,並不適用於1.pcd文件(1.pcd文件只有XYZ字段,沒有強度字段)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM