PCL學習記錄-1 Filter-1 PassThrough filter(直通濾波器)功能及用法解析

HarwardWu發表於2020-11-29

PCL系列部落格主要用來記錄學習PointCloudLibrary點雲庫的過程,以及備忘。

學習資料主要來源為: PCL點雲庫(Tutorial)+Github部落格+ 《點雲庫PCL學習教程

引:為什麼要進行濾波,以及PCL點雲庫中,包含的幾種常用的濾波方法簡介

  在獲取點雲資料時,由於裝置精度、操作者經驗、環境因素等帶來的影響,以及電磁波衍射特性、被測物體表面性質變化和資料拼接配準操作過程的影響,點雲資料中將不可避免地出現一些噪聲點。實際應用中除了這些測量隨機誤差產生的噪聲點之外,由於受到外界干擾如視線遮擋、障礙物等因素的影響,點雲資料中往往存在著一些離主體點雲較遠的離散點,即離群點。不同的獲取裝置點雲噪聲結構也有不同。

  通過濾波完成的功能還包括孔洞修復、最小資訊損失的海量點雲資料壓縮處理等在點雲處理流程中濾波處理作為預處理的第一步,往往對後續處理流程影響很大,只有在濾波預處理中將噪聲點、離群點、孔洞、資料壓縮等 按照後續需求處理,才能夠更好地進行配準、特徵提取、曲面重建、視覺化等後續流程。

  PCL 中點雲濾波模組提供了很多靈活實用的濾波處理演算法,例如雙邊濾波、高斯濾波、條件濾波、直通濾波、基於隨機取樣一致性濾波RANSAC等。濾波模組是作為 PCL的一個重要處理模組,其在應用中可以非常方便與其他點雲處理流程協同使用。

  • 濾波相關文件:

      https://pcl-tutorials.readthedocs.io/en/latest/#filtering

  • 應用場景
  1. 點雲資料密度不規則需要平滑處理
  2. 去除因為遮擋等問題造成離群點
  3. 資料量較大,需要進行下采樣( Downsample)
  4. 去除噪聲資料。
  • 示例

     下圖顯示了一個噪聲消除的示例。 由於測量誤差,某些資料集會出現大量陰影點。 這使區域性點雲3D特徵的估算變得複雜。我們通過對每個點的鄰域進行統計分析,並修剪掉不符合特定條件的那些異常值,進而可以過濾掉某些異常值。

      PCL中的實現這些稀疏離群值的消除,需要計算資料集中的點與鄰居距離的分佈。 即對於每個點,都會計算從它到所有相鄰點的平均距離。 通過假設結果分佈是具有均值和標準差的高斯分佈,可以將那些平均距離在【由全域性距離均值和標準差定義的區間】之外的所有點視為離群值,並將之從資料集中進行修剪。

_images/statistical_removal_2.jpg


一. PassThroughFilter(直通濾波)

PassThroughFilter直通濾波原理:直通濾波主要功能是將設定範圍之外(距離原點XYZ距離範圍)的全部點給過濾掉,或者僅保留該區域的點。

直通濾波的主要使用過程(以官方Tutorial為例:https://pcl.readthedocs.io/projects/tutorials/en/latest/passthrough.html#passthrough):

  1. 建立待處理點雲物件,以及儲存點雲處理完成後的點雲物件。
  2. 設定點雲的容量:寬+高+長×寬;
  3. 設定點雲內所有點的xyz座標;
  4. 建立PassThroughFilter物件,並設定其濾波引數。
  5. 將待處理點雲物件作為filter的輸入進行濾波;
  6. 得到結果:在filter物件設定的x,y,z的範圍之內的點將被保留,範圍之外的點將被捨棄,實現直通濾波的功能

二.直通濾波的程式碼:

1. PassThroughFilter.cpp

#include <iostream>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>
#include <pcl/visualization/cloud_viewer.h>

int main(int argc, char ** argv){
    //step1. 建立處理前及處理之後的點雲物件
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud(new pcl::PointCloud<pcl::PointXYZ>);

    //step2, 設定處理前的點雲物件(容量大小,點位置等)(宣告物件->確定大小->為每個點賦值)
    cloud->width=5;
    cloud->height=1;
    cloud->points.resize(cloud->width *  cloud->height);

    for (auto& point: *cloud ){
    point.x=1024 * rand()/(RAND_MAX +1.0f);
    point.y=1024 * rand()/(RAND_MAX +1.0f);  
    point.z=1024 * rand()/(RAND_MAX +1.0f);  
    }

    //step3. 至此,例項點雲已經生成完畢,輸出處理前的點雲資訊
    std::cerr <<"The points data are shown below:" <<std::endl;
    for(const auto &point: *cloud){
        std::cerr<< "  "<<point.x<< "  "
                        <<point.y<< "  "
                        <<point.z<< std::endl;
    }
    //step4: 建立直通濾波物件
    pcl::PassThrough<pcl::PointXYZ> pass;
    pass.setInputCloud(cloud);
    pass.setFilterFieldName("z");
    pass.setFilterLimits(0.0,1.0);
    pass.filter(*filtered_cloud);//儲存處理之後的點雲
    
    
    /************************************************************************************
   建立直通濾波器的物件,設立引數,濾波欄位名被設定為Z軸方向,可接受的範圍為(0.0,1.0)
   即將點雲中所有點的Z軸座標不在該範圍內的點過濾掉或保留,這裡是過濾掉,由函式setFilterLimitsNegative設定
   ***********************************************************************************/


    //step5. 顯示處理之後的點雲詳細資訊
    std::cerr<<"The pointcloud has been processed successfully"<< std::endl;
        for(const auto &point: *filtered_cloud){
        std::cerr<< "  "<<point.x<< "  "
                        <<point.y<< "  "
                        <<point.z<< std::endl;
    } 
    //Display
    pcl::visualization::CloudViewer viewer("Cloud Viewer");
    viewer.showCloud(filtered_cloud);
    while (!viewer.wasStopped()) {
    }

    return (0);

}

2. CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(passthroughfilter)

find_package(PCL 1.2 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable (passthroughfilter passthroughfilter.cpp)
target_link_libraries (passthroughfilter ${PCL_LIBRARIES})

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

3.執行結果:可以看到,隨機生成了5個點,其中兩個點的Z座標處於範圍內(得到保留),另外兩個點在範圍外(被捨棄)

anson@anson-Inspiron:~/PCL_learning/PCL_Official_Online_Learning/01_Filters/01_PassThroughFilter/build$ ./passthroughfilter 
The points data are shown below:
  0.352222  -0.151883  -0.106395
  -0.397406  -0.473106  0.292602
  -0.731898  0.667105  0.441304
  -0.734766  0.854581  -0.0361733
  -0.4607  -0.277468  -0.916762
The pointcloud has been processed successfully
  -0.397406  -0.473106  0.292602
  -0.731898  0.667105  0.441304
^C
anson@anson-Inspiron:~/PCL_learning/PCL_Official_Online_Learning/01_Filters/01_PassThroughFilter/build$ ./passthroughfilter 
The points data are shown below:
  0.352222  -0.151883  -0.106395
  -0.397406  -0.473106  0.292602
  -0.731898  0.667105  0.441304
  -0.734766  0.854581  -0.0361733
  -0.4607  -0.277468  -0.916762
The pointcloud has been processed successfully
  -0.397406  -0.473106  0.292602
  -0.731898  0.667105  0.441304
^C

 

 

 

 

 

 

 

相關文章