而條件濾波(condition removal filter)正好可以解決這個問題,條件濾波相比於直通濾波優點就是一次可以對多個軸的範圍進行劃定限制。允許自由地新增和組合xyz三個座標軸方向的範圍限制,相比與直通濾波的「一刀切」剔除點雲的方法,條件濾波則是你想怎麼切就怎麼切,切幾刀都行。所以可以把條件濾波看作乙個加強版的,可自定義的直通濾波看待。下面直接放出使用示例**:
#include #include
#include "pcl/point_types.h"
#include "pcl/filters/conditional_removal.h"
#include "pcl/visualization/pcl_visualizer.h"
int main(int argc, char** ar**));}
//step2: 建立條件濾波物件
pcl::conditionalremoval conditional_removal;
//step3: 設定條件濾波引數
//條件與
//保留點雲xyz座標都在[1,2]之內的點
pcl::conditionand::ptr condition_add(new pcl::conditionand());
condition_add->addcomparison(pcl::fieldcomparison::constptr(new pcl::fieldcomparison("z", pcl::comparisonops::ge, 1.0)));
condition_add->addcomparison(pcl::fieldcomparison::constptr(new pcl::fieldcomparison("z", pcl::comparisonops::le, 2.0)));
condition_add->addcomparison(pcl::fieldcomparison::constptr(new pcl::fieldcomparison("y", pcl::comparisonops::ge, 1.0)));
condition_add->addcomparison(pcl::fieldcomparison::constptr(new pcl::fieldcomparison("y", pcl::comparisonops::le, 2.0)));
condition_add->addcomparison(pcl::fieldcomparison::constptr(new pcl::fieldcomparison("x", pcl::comparisonops::ge, 1.0)));
condition_add->addcomparison(pcl::fieldcomparison::constptr(new pcl::fieldcomparison("x", pcl::comparisonops::le, 2.0)));
//條件或
pcl::conditionor::ptr condition_or(new pcl::conditionor());
condition_or->addcomparison(pcl::fieldcomparison::constptr(new pcl::fieldcomparison("z", pcl::comparisonops::ge, 2)));
condition_or->addcomparison(pcl::fieldcomparison::constptr(new pcl::fieldcomparison("x", pcl::comparisonops::ge, 1.5)));
//condition_add->addcondition(condition_or);
condition_or->addcondition(condition_add);
conditional_removal.setcondition(condition_or);
conditional_removal.setinputcloud(cloud);
//step4: 執行濾波處理
conditional_removal.filter(*cloud_filtered);
//step5: 視覺化濾波結果
pcl::visualization::pclvisualizer viewer("pcl condition removal filter");
pcl::visualization::pointcloudcolorhandlercustom cloud_handler(cloud, 255, 0, 0);
viewer.addpointcloud(cloud, cloud_handler, "cloud");
pcl::visualization::pointcloudcolorhandlercustom filtered_handler(cloud_filtered, 0, 255, 0);
viewer.addpointcloud(cloud_filtered, filtered_handler, "cloud_filtered");
viewer.addcoordinatesystem(1);
while (!viewer.wasstopped())
viewer.close();
return 0;
流程步驟在**中注釋已經簡單說明了,這裡就幾個點做一下補充。
condition_add->addcomparison(pcl::fieldcomparison::constptr(new pcl::fieldcomparison(「z」, pcl::comparisonops::ge, 1.0)));
引數z表示設定z軸的範圍條件,ge,1.0是 greater equal, 即表示z軸要大於等於1.0。其他類似還有
pcl::comparisonops::le //小於等於
pcl::comparisonops::gt //大於
pcl::comparisonops::lt //小於
pcl::comparisonops::eq //相等
setcondition可以值用conditionand或者conditionor條件物件。
只用conditionand測試
只用conditionor測試
也可以將conditionand合併到conditionor後設定conditionor,反過來也可以將conditionor合併到conditionand後設定conditionand,但需要注意的是新增的順序不一樣,組合成的條件結果是不一樣的,這個與程式設計裡邊&&、||邏輯與或的短路原理是一樣的。
conditionand合併到conditionor後設定conditionor
此時合併遵循||
或的邏輯,所以效果與單獨設定conditionor是一樣的
conditionor合併到conditionand後設定conditionand
此時合併遵循&&
與的邏輯,所以效果與單獨設定conditionand是一樣的
PCL 濾波 直通濾波
在獲取點雲資料時 由於裝置精度,操作者經驗環境因素帶來的影響,以及電磁波的衍射特性,被測物體表面性質變化和資料拼接配準操作過程的影響,點雲資料中講不可避免的出現一些雜訊。在點雲處理流程中濾波處理作為預處理的第一步,對後續的影響比較大,只有在濾波預處理中將雜訊點 離群點,孔洞,資料壓縮等按照後續處理定...
pcl 統計濾波
作用 可以用來剔除離群點,或者測量誤差導致的粗差點。其特徵是在空間中分布稀疏,可以理解為 每個點都表達一定資訊量,某個區域點越密集則可能資訊量越大。雜訊資訊屬於無用資訊,資訊量較小。所以離群點表達的資訊可以忽略不計。統計濾波器的實現原理如下 首先,遍歷點雲,計算每個點與其最近的k個鄰居點之間的平均距...
PCL濾波介紹(2)
1 使用statisticaloutlierremoval濾波器移除離群點 使用統計分析技術,從乙個點雲資料中集中移除測量雜訊點 也就是離群點 比如 雷射掃瞄通常會產生密度不均勻的點雲資料集,另外測量中的誤差也會產生稀疏的離群點,使效果不好,估計區域性點雲特徵 例如取樣點處法向量或曲率變化率 的運算...