PCL學習記錄-1 Filter-1 PassThrough filter(直通濾波器)功能及用法解析
PCL系列部落格主要用來記錄學習PointCloudLibrary點雲庫的過程,以及備忘。
學習資料主要來源為: PCL點雲庫(Tutorial)+Github部落格+ 《點雲庫PCL學習教程》
引:為什麼要進行濾波,以及PCL點雲庫中,包含的幾種常用的濾波方法簡介
在獲取點雲資料時,由於裝置精度、操作者經驗、環境因素等帶來的影響,以及電磁波衍射特性、被測物體表面性質變化和資料拼接配準操作過程的影響,點雲資料中將不可避免地出現一些噪聲點。實際應用中除了這些測量隨機誤差產生的噪聲點之外,由於受到外界干擾如視線遮擋、障礙物等因素的影響,點雲資料中往往存在著一些離主體點雲較遠的離散點,即離群點。不同的獲取裝置點雲噪聲結構也有不同。
通過濾波完成的功能還包括孔洞修復、最小資訊損失的海量點雲資料壓縮處理等 。在點雲處理流程中濾波處理作為預處理的第一步,往往對後續處理流程影響很大,只有在濾波預處理中將噪聲點、離群點、孔洞、資料壓縮等 按照後續需求處理,才能夠更好地進行配準、特徵提取、曲面重建、視覺化等後續流程。
PCL 中點雲濾波模組提供了很多靈活實用的濾波處理演算法,例如雙邊濾波、高斯濾波、條件濾波、直通濾波、基於隨機取樣一致性濾波RANSAC等。濾波模組是作為 PCL的一個重要處理模組,其在應用中可以非常方便與其他點雲處理流程協同使用。
- 濾波相關文件:
https://pcl-tutorials.readthedocs.io/en/latest/#filtering
- 應用場景
- 點雲資料密度不規則需要平滑處理
- 去除因為遮擋等問題造成離群點
- 資料量較大,需要進行下采樣( Downsample)
- 去除噪聲資料。
- 示例
下圖顯示了一個噪聲消除的示例。 由於測量誤差,某些資料集會出現大量陰影點。 這使區域性點雲3D特徵的估算變得複雜。我們通過對每個點的鄰域進行統計分析,並修剪掉不符合特定條件的那些異常值,進而可以過濾掉某些異常值。
PCL中的實現這些稀疏離群值的消除,需要計算資料集中的點與鄰居距離的分佈。 即對於每個點,都會計算從它到所有相鄰點的平均距離。 通過假設結果分佈是具有均值和標準差的高斯分佈,可以將那些平均距離在【由全域性距離均值和標準差定義的區間】之外的所有點視為離群值,並將之從資料集中進行修剪。
一. PassThroughFilter(直通濾波)
PassThroughFilter直通濾波原理:直通濾波主要功能是將設定範圍之外(距離原點XYZ距離範圍)的全部點給過濾掉,或者僅保留該區域的點。
直通濾波的主要使用過程(以官方Tutorial為例:https://pcl.readthedocs.io/projects/tutorials/en/latest/passthrough.html#passthrough):
- 建立待處理點雲物件,以及儲存點雲處理完成後的點雲物件。
- 設定點雲的容量:寬+高+長×寬;
- 設定點雲內所有點的xyz座標;
- 建立PassThroughFilter物件,並設定其濾波引數。
- 將待處理點雲物件作為filter的輸入進行濾波;
- 得到結果:在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
相關文章
- 卡爾曼濾波器學習筆記筆記
- Gabor濾波器學習
- 測試卡爾曼濾波器(Kalman Filter)Filter
- 圖解卡爾曼濾波(Kalman Filter)--理解1圖解Filter
- angular學習筆記(十六) -- 過濾器(1)Angular筆記過濾器
- GLSL學習_高斯濾波
- LevelDB 學習筆記1:布隆過濾器筆記過濾器
- 【Java基礎】--filter過濾器原理解析JavaFilter過濾器
- Filter過濾器Filter過濾器
- OpenCV計算機視覺學習(4)——影像平滑處理(均值濾波,高斯濾波,中值濾波,雙邊濾波)OpenCV計算機視覺
- 詳解卡爾曼濾波(Kalman Filter)原理Filter
- 粒子濾波(Particle Filter)的通俗解釋Filter
- 卡爾曼濾波學習資料
- 【OpenCV學習】影象卷積濾波OpenCV卷積
- 數字濾波器和模擬濾波器(一)
- 學習日記1——ubuntu環境下學習C++以及安裝PCL庫UbuntuC++
- Stream中filter過濾條件問題記錄Filter
- SpringBoot+Shiro學習(七):Filter過濾器管理Spring BootFilter過濾器
- flutter學習記錄-1Flutter
- PHP 過濾器(Filter)PHP過濾器Filter
- Java Filter過濾器JavaFilter過濾器
- lucene Filter過濾器Filter過濾器
- 點雲濾波器與過濾器過濾器
- Spring學習記錄1Spring
- C++學習記錄1C++
- Filter過濾器的使用Filter過濾器
- JavaWeb 中 Filter過濾器JavaWebFilter過濾器
- angular學習筆記(十六) -- 過濾器(2)Angular筆記過濾器
- 影像噪聲學習記錄(1)
- TA學習記錄Day1
- starrycan的pwn學習記錄1
- 布隆過濾器(Bloom Filter)過濾器OOMFilter
- 布隆過濾器 Bloom Filter過濾器OOMFilter
- Bloom Filter 布隆過濾器OOMFilter過濾器
- servlet的過濾器filter類Servlet過濾器Filter
- angular內建過濾器-filterAngular過濾器Filter
- Particle Filter Tutorial 粒子濾波:從推導到應用(一)Filter
- 攔截器(Interceptor)與過濾器(Filter)過濾器Filter