PCL濾波器總結1
兩種範圍濾波器:
1.PassThrough
作用:延某個維度過濾點雲,刪除範圍內或範圍外的點。
示例:
// Create the filtering object pcl::PassThrough<pcl::PointXYZ> pass; pass.setInputCloud (cloud); pass.setFilterFieldName ("z"); pass.setFilterLimits (0.0, 1.0); //pass.setFilterLimitsNegative (true); pass.filter (*cloud_filtered);
2.ConditionalRemoval
作用:功能比1多一些,可以刪除給定輸入雲中不滿足一個或多個給定條件的所有索引,具體參見API文件:http://docs.pointclouds.org/1.8.0/classpcl_1_1_conditional_removal.html#a46d48542fa99bf5d338506506fbf9125
示例:
//build the condition pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond (new pcl::ConditionAnd<pcl::PointXYZ> ()); range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new pcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::GT, 0.0))); range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new pcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::LT, 0.8))); // build the filter pcl::ConditionalRemoval<pcl::PointXYZ> condrem; condrem.setCondition (range_cond); condrem.setInputCloud (cloud); condrem.setKeepOrganized(true); // apply filter condrem.filter (*cloud_filtered);
兩種基於點雲分佈的濾波器
1.RadiusOutlierRemoval
設定搜尋半徑和近鄰點數量,每個索引必須在指定的搜尋半徑內有大於設定值的近鄰點數量,否則將會被從點雲中刪除。例如,如果設定近鄰點數量為1,那麼只有黃色的點將從PointCloud中刪除。如果設定為2,那麼黃色和綠色的點都將從PointCloud中刪除。
下面的程式碼建立RadiusOutlierRemoval過濾器物件,設定其引數並將其應用於輸入點雲。搜尋半徑設定為0.8,並且一個點必須在該半徑中至少有2個鄰點才能保留為PointCloud的一部分。
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem; // build the filter outrem.setInputCloud(cloud); outrem.setRadiusSearch(0.8); outrem.setMinNeighborsInRadius (2); // apply filter outrem.filter (*cloud_filtered);
2.StatisticalOutlierRemoval
使用統計的方法進行濾波
鐳射掃描通常生成具有不同點密度的點雲資料集。此外,測量誤差會導致稀疏異常值,從而進一步破壞結果。這使得區域性點雲特徵(例如表面法線或曲率變化)的估計變得複雜,導致錯誤的值。這些不規則性中的一些可以通過對每個點的鄰域執行統計分析並且刪除那些不符合特定標準的點來解決。StatisticalOutlierRemoval基於輸入資料集中點到鄰居距離的分佈的計算,對於每個點,計算從它到所有鄰近點的平均距離。假設得到的分佈是高斯分佈,有一個均值和一個標準差,那麼所有平均距離在全域性距離均值(?)和標準差定義的區間之外的點都可以被視為離群值,並從資料集中進行刪除。
下圖顯示了稀疏異常值分析和刪除的效果:原始資料集顯示在左側,結果資料集顯示在右側。該圖顯示了濾波前後點鄰域的平均k-最近鄰距離。圖中紅色代表原始資料分佈,綠色代表濾波後資料分佈。
示例:
// Create the filtering object
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud (cloud);
sor.setMeanK (50);
sor.setStddevMulThresh (1.0);
sor.filter (*cloud_filtered);
上例中將每個點要分析的鄰域數設為50,標準差乘子設為1。這意味著,到查詢點的平均距離的一個標準差以上的所有點都將標記為離群值並被刪除。輸出被計算並存儲在cloud_filter中。(標準差的設定要根據結果視覺效果分析嗎?)