pcl_filters模块api代码解析
招募一起學習的小伙伴,加入我們群聊中,定期分享論文,以及工程相關的問題,討論分享。根據自己的愛好,加入不同的點云交流群,我們期待有學習點云深度學習,點云PCL,cloudcompare,以及GDAL,Open3D相關的研究人員加入我們。加入方式:后臺發送微信群,按要求備注即可。
? ? ? ?pcl_filters庫包含3D點云數據的離群點和噪聲點去除等功能。PCL中主要的濾波器有直通濾波器,體素格濾波器,統計濾波器,半徑濾波器 等。不同特性的濾波器構成了較為完整的點云前處理族,并組合使用完成任務。實際上,濾波手段的選擇和采集方式是密不可分的。
? ? ? ?點云濾波,顧名思義,就是濾掉噪聲。原始采集的點云數據往往包含大量散列點、孤立點,?在獲取點云數據時 ,由于設備精度,操作者經驗環境因素帶來的影響,以及電磁波的衍射特性,被測物體表面性質變化和數據拼接配準操作過程的影響,點云數據中講不可避免的出現一些噪聲。在點云處理流程中濾波處理作為預處理的第一步,對后續的影響比較大,只有在濾波預處理中,?將噪聲點 ,離群點,孔洞,數據壓縮等按照后續處理定制,才能夠更好的進行配準,特征提取,曲面重建,可視化等后續應用處理.,其類似于信號處理中的濾波。
? ? ?1. 點云不是函數,無法建立橫縱坐標之間的關系
?????2. 點云在空間中是離散的,不像圖像信號有明顯的定義域
?????3. 點云在空間中分布廣泛,建立點與點之間的關系較為困難
?????4. 點云濾波依賴于集合信息而非數值信息
?點云濾波方法主要有:
1. 直通濾波器 pcl::PassThrough<pcl::PointXYZ> pass
2. 體素格濾波器 pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
3. 統計濾波器????pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
4. 半徑濾波器????pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
5. 雙邊濾波??pcl::BilateralFilter<pcl::PointXYZ> bf;
6. 高斯濾波????pcl::filters::GaussianKernel< PointInT, PointOutT >??
7. 立方體濾波?pcl::CropBox< PointT>? ??
8. 封閉曲面濾波?pcl::CropHull< PointT>? ?
9. 空間剪裁:
???????pcl::Clipper3D<pcl::PointXYZ>
????????pcl::BoxClipper3D<pcl::PointXYZ>
????????pcl::CropBox<pcl::PointXYZ>
????????pcl::CropHull<pcl::PointXYZ>?
10. 卷積濾波:實現將兩個函數通過數學運算產生第三個函數,可以設定不同的卷積核
???????pcl::filters::Convolution<PointIn, PointOut>
????????pcl::filters::ConvolvingKernel<PointInT, PointOutT>
11. 隨機采樣一致濾波等,通常組合使用完成任務。
PCL中總結了幾種需要進行點云濾波處理情況
??(1)??點云數據密度不規則需要平滑
??(2) 因為遮擋等問題造成離群點需要去除
??(3) 大量數據需要下采樣
??(4) 噪聲數據需要去除
對應的方案如下:
??(1)按照給定的規則限制過濾去除點
??(2) 通過常用濾波算法修改點的部分屬性
??(3)對數據進行下采樣
class? pcl::ApproximateVoxelGrid< PointT >
對點云進行網格化下采樣濾波處理
向上滑動閱覽
void gridSampleApprox (const CloudConstPtr &cloud, Cloud &result, double leaf_size)
{
??pcl::ApproximateVoxelGrid<pcl::PointXYZRGBA> grid;
??grid.setLeafSize (static_cast<float> (leaf_size), static_cast<float> (leaf_size),? static_cast<float> (leaf_size));
??grid.setInputCloud (cloud);
??grid.filter (result);
}
class??pcl::BilateralFilter< PointT >
實現點云的雙邊濾波功能,具體理論可以查看論文
C. Tomasi and R. Manduchi. Bilateral Filtering for Gray and Color Images. In Proceedings of the IEEE International Conference on Computer Vision, 1998
該類的實現利用的并非XYZ字段的數據進行,?而是利用強度數據進行雙邊濾波算法的實現, 所以在使用該類時點云的類型必須有強度字段,否則無法進行雙邊濾波處理,雙邊濾波算法是通過取臨近采樣點和加權平均來修正當前采樣點的位置,從而達到濾波效果,同時也會有選擇剔除與當前采樣點“差異”太大的相鄰采樣點,從而保持原特征的目的
class??pcl::BoxClipper3D< PointT >
實現空間裁剪
以下幾個函數實現空間剪裁:
????????pcl::Clipper3D<pcl::PointXYZ>
????????pcl::BoxClipper3D<pcl::PointXYZ>
????????pcl::CropBox<pcl::PointXYZ>
????????pcl::CropHull<pcl::PointXYZ> 剪裁并形成封閉曲面
class??pcl::ConditionalRemoval< PointT >
ConditionalRemoval過濾滿足特定條件的數據??梢砸淮蝿h除滿足對輸入的點云設定的一個或多個條件指標的所有的數據點,刪除點云中不符合用戶指定的一個或者多個條件的數據點,用戶必須為ConditionalRemoval提供條件。有兩種類型的條件:ConditionAnd和ConditionOr。?
向上滑動閱覽
#include <pcl/filters/conditional_removal.h>
??//創建條件限定的下的濾波器
??// 創建點云對象 指針
??pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
??pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
??// 源點云讀取獲取后
??//創建條件定義對象
??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)));???
??//添加在Z字段上大于(pcl::ComparisonOps::GT great Then)0的比較算子
??range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new
????????pcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::LT, 0.8)));???
??//添加在Z字段上小于(pcl::ComparisonOps::LT Lower Then)0.8的比較算子
??// 曲率條件
??// 創建條件定義對象??曲率
??// pcl::ConditionOr<PointNormal>::Ptr range_cond (new pcl::ConditionOr<PointNormal> () );
??// range_cond->addComparison (pcl::FieldComparison<PointNormal>::ConstPtr (// 曲率 大于
? new pcl::FieldComparison<PointNormal> ("curvature", pcl::ComparisonOps::GT, threshold))
? ? );
??
??// 創建濾波器并用條件定義對象初始化
??????pcl::ConditionalRemoval<pcl::PointXYZ> condrem;//創建條件濾波器
??????condrem.setCondition (range_cond); //并用條件定義對象初始化????????????
??????condrem.setInputCloud (cloud);?????//輸入點云
??????condrem.setKeepOrganized(true);????//設置保持點云的結構
??????// 執行濾波
??????condrem.filter(*cloud_filtered);??//大于0.0小于0.8這兩個條件用于建立濾波器
class??pcl::filters::Convolution< PointIn, PointOut >
卷積濾波:實現將兩個函數通過數學運算產生第三個函數,
該類提供點云的行,列和單獨的卷積操作。只有有組織后者是有序的點云才允許使用列和單獨的卷積。
可以設定不同的卷積核,有以下幾種操作
????? ?pcl::filters::Convolution<PointIn, PointOut>
????????pcl::filters::ConvolvingKernel<PointInT, PointOutT>
? ? ? ? pcl::filters::GaussianKernel< PointInT, PointOutT >
? ? ? ? pcl::filters::GaussianKernelRGB< PointInT, PointOutT >
?pcl::PointCloud<pcl::PointXYZRGB>::Ptr input_cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
??pcl::PointCloud<pcl::PointXYZRGB>::Ptr kernel_cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
??pcl::PointCloud<pcl::PointXYZRGB>::Ptr output_cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
??/*example 1 : Gaussian Smoothing*/
??kernel.sigma_ = 2.0;
??kernel.kernel_size_ = 3;
??kernel.gaussianKernel (*kernel_cloud);
??convolution.kernel_ = *kernel_cloud;
??convolution.convolve (*output_cloud, *input_cloud);
class??pcl::ExtractIndices< PointT >
從點云中提取一組索引。
向上滑動閱覽
案例1 :
pcl::ExtractIndices<PointType> eifilter (true); // Initializing with true will allow us to extract the removed indices
eifilter.setInputCloud (cloud_in);
eifilter.setIndices (indices_in);
eifilter.filter (*cloud_out);
// The resulting cloud_out contains all points of cloud_in that are indexed by indices_in
indices_rem = eifilter.getRemovedIndices ();
// The indices_rem array indexes all points of cloud_in that are not indexed by indices_in
eifilter.setNegative (true);
eifilter.filter (*indices_out);
// Alternatively: the indices_out array is identical to indices_rem
eifilter.setNegative (false);
eifilter.setUserFilterValue (1337.0);
eifilter.filterDirectly (cloud_in);
// This will directly modify cloud_in instead of creating a copy of the cloud
// It will overwrite all fields of the filtered points by the user value: 1337
案例2:
基于某一分割算法提取點云中的一個子集
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/extract_indices.h>
// 設置ExtractIndices的實際參數
pcl::ExtractIndices<pcl::PointXYZ> extract;????????//創建點云提取對象
// 創建點云索引對象
pcl::PointIndices::Ptr inliers (new pcl::PointIndices());
// 分割點云
// 為了處理點云包含的多個模型,在一個循環中執行該過程并在每次模型被提取后,保存剩余的點進行迭代
seg.setInputCloud (cloud_filtered);// 設置源 濾波后的點云
seg.segment (*inliers, *coefficients);// 輸入分割系數得到 分割后的點云 索引inliers
// 提取索引 Extract the inliers
extract.setInputCloud (cloud_filtered);
extract.setIndices (inliers);
extract.setNegative (false);
extract.filter (*cloud_p);// 按索引提取 點云
class? ?pcl::FrustumCulling< PointT >
在相機的位姿和視野給出的平截頭體內進行點云濾波。
pcl::PointCloud <pcl::PointXYZ>::Ptr source;
// .. read or fill the source cloud
pcl::FrustumCulling<pcl::PointXYZ> fc;
fc.setInputCloud (source);
fc.setVerticalFOV (45);
fc.setHorizontalFOV (60);
fc.setNearPlaneDistance (5.0);
fc.setFarPlaneDistance (15);
Eigen::Matrix4f camera_pose;
// .. read or input the camera pose from a registration algorithm.
fc.setCameraPose (camera_pose);
pcl::PointCloud <pcl::PointXYZ> target;
fc.filter (target);
class? ?pcl::GridMinimum< PointT >
? ? ? 在給定的點云上進行2D網格,并對數據進行下采樣。
class??pcl::LocalMaximum< PointT >
? ? ? 通過消除局部最大的點來對點云進行下采樣。
class? ?pcl::MedianFilter< PointT >
中值濾波器
??pcl::MedianFilter<pcl::PointXYZRGBA> fbf;
??fbf.setInputCloud (cloud_in);
??fbf.setMaxAllowedMovement (max_allowed_movement_);
??fbf.setWindowSize (window_size_);
??fbf.filter (*cloud_out);
class? ?pcl::NormalRefinement< NormalT >
法向量重定義(可以做實驗驗證,原本雜亂的法向量經過處理后會具有一致性),該類通過迭代地更新其鄰域中所有法線的(加權)均值的每個法線來細化一組已經估計的法線。目的是重復使用與估計原始法線時相同的點對應關系,以避免重復最近鄰搜索。
向上滑動閱覽
// Input point cloud
pcl::PointCloud<PointT> cloud;
// Fill cloud...
// Estimated and refined normals
pcl::PointCloud<NormalT> normals;
pcl::PointCloud<NormalT> normals_refined;
// Search parameters
const int k = 5;
std::vector<std::vector<int> > k_indices;
std::vector<std::vector<float> > k_sqr_distances;
// Run search
pcl::search::KdTree<pcl::PointXYZRGB> search;
search.setInputCloud (cloud.makeShared ());
search.nearestKSearch (cloud, std::vector<int> (), k, k_indices, k_sqr_distances);
// Use search results for normal estimation
pcl::NormalEstimation<PointT, NormalT> ne;
for (unsigned int i = 0; i < cloud.size (); ++i)
{
NormalT normal;
ne.computePointNormal (cloud, k_indices[i]
normal.normal_x, normal.normal_y, normal.normal_z, normal.curvature);
pcl::flipNormalTowardsViewpoint (cloud[i], cloud.sensor_origin_[0], cloud.sensor_origin_[1], cloud.sensor_origin_[2],
normal.normal_x, normal.normal_y, normal.normal_z);
normals.push_back (normal);
}
// Run refinement using search results
pcl::NormalRefinement<NormalT> nr (k_indices, k_sqr_distances);
nr.setInputCloud (normals.makeShared ());
nr.filter (normals_refined);
class??pcl::PassThrough< PointT >
如果使用線結構光掃描的方式采集點云,必然物體沿z向分布較廣,但x,y向的分布處于有限范圍內。?此時可使用直通濾波器,確定點云在x或y方向上的范圍,可較快剪除離群點,達到第一步粗處理的目的。
向上滑動閱覽
// 創建點云對象 指針
????pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
????pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
????// 原點云獲取后進行濾波
????pcl::PassThrough<pcl::PointXYZ> pass;// 創建濾波器對象
????pass.setInputCloud (cloud);//設置輸入點云
????pass.setFilterFieldName ("z");//濾波字段名被設置為Z軸方向
????pass.setFilterLimits (0.0, 1.0);//可接受的范圍為(0.0,1.0)
????//pass.setFilterLimitsNegative (true);//設置保留范圍內 還是 過濾掉范圍內
????pass.filter (*cloud_filtered); //執行濾波,保存過濾結果在cloud_filtered
class??pcl::ProjectInliers< PointT >
使用Point Cloud中的模型和一組inlier指數將它們投影到單獨的PointCloud中。使用參數化模型投影點云,如何將點投影到一個參數化模型上(平面或者球體等),參數化模型通過一組參數來設定,對于平面來說使用其等式形式。在PCL中有特定存儲常見模型系數的數據結構。
向上滑動閱覽
#include <iostream>
??#include <pcl/io/pcd_io.h>
??#include <pcl/point_types.h>
??#include <pcl/ModelCoefficients.h>????????//模型系數頭文件
??#include <pcl/filters/project_inliers.h> //投影濾波類頭文件
??// 創建點云對象 指針
??pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
??pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_projected (new pcl::PointCloud<pcl::PointXYZ>);
??// 源點云讀取 獲取 后
????//隨機創建點云并打印出來
????cloud->width??= 5;
????cloud->height = 1;
????cloud->points.resize (cloud->width * cloud->height);
????for (size_t i = 0; i < cloud->points.size (); ++i)
????{
??????cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
??????cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
??????cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
????}
??// 填充ModelCoefficients的值,使用ax+by+cz+d=0平面模型,其中 a=b=d=0,c=1 也就是X——Y平面
????//定義模型系數對象,并填充對應的數據 創建投影濾波模型重會設置模型類型 pcl::SACMODEL_PLANE
????pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients());
????coefficients->values.resize (4);
????coefficients->values[0] = coefficients->values[1] = 0;
????coefficients->values[2] = 1.0;
????coefficients->values[3] = 0;
????// 創建投影濾波模型ProjectInliers對象,使用ModelCoefficients作為投影對象的模型參數
????pcl::ProjectInliers<pcl::PointXYZ> proj;?????//創建投影濾波對象
????proj.setModelType (pcl::SACMODEL_PLANE);?????//設置對象對應的投影模型 平面模型
????proj.setInputCloud (cloud);??????????????????//設置輸入點云
????proj.setModelCoefficients (coefficients);????//設置模型對應的系數
????proj.filter (*cloud_projected);???????????? //投影結果存儲
??// 輸出
???std::cerr << "Cloud after projection: " << std::endl;
????for (size_t i = 0; i < cloud_projected->points.size (); ++i)
??????std::cerr << "????" << cloud_projected->points[i].x << " "
??????????????????????????<< cloud_projected->points[i].y << " "
??????????????????????????<< cloud_projected->points[i].z << std::endl;
class??pcl::VoxelGrid< PointT >
? ? ? 如果使用高分辨率相機等設備對點云進行采集,往往點云會較為密集。?過多的點云數量會對后續分割工作帶來困難。體素格濾波器可以達到向下采樣同時不破壞點云本身幾何結構的功能。點云幾何結構 不僅是宏觀的幾何外形,也包括其微觀的排列方式,比如橫向相似的尺寸,縱向相同的距離。?隨機下采樣雖然效率比體素濾波器高,但會破壞點云微觀結構.
? ? ? 使用體素化網格方法實現下采樣,即減少點的數量 減少點云數據,并同時保存點云的形狀特征,在提高配準,曲面重建,形狀識別等算法速度中非常實用,PCL是實現的VoxelGrid類通過輸入的點云數據創建一個三維體素柵格,容納后每個體素內用體素中所有點的重心來近似顯示體素中其他點,這樣該體素內所有點都用一個重心點最終表示,對于所有體素處理后得到的過濾后的點云,?這種方法比用體素中心(注意中心和重心)逼近的方法更慢,但是對于采樣點對應曲面的表示更為準確。
向上滑動閱覽
// 創建點云對象 指針
????pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ());
????pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());
????// 源點云讀取 獲取 后
??????pcl::VoxelGrid<pcl::PCLPointCloud2> sor;??//創建濾波對象
??????sor.setInputCloud (cloud);???????????? //設置需要過濾的點云(指針) 給濾波對象
??????sor.setLeafSize (0.01f, 0.01f, 0.01f);?? //設置濾波時創建的體素體積為1cm的立方體
??????sor.filter (*cloud_filtered);??????????? //執行濾波處理,存儲輸出
class??pcl::VoxelGridOcclusionEstimation< PointT >
估計場景中的遮擋空間。具體查看論文:
John Amanatides and Andrew Woo, A Fast Voxel Traversal Algorithm for Ray Tracing
class??pcl::StatisticalOutlierRemoval< PointT >
? ? 統計濾波器用于去除明顯離群點(離群點往往由測量噪聲引入)。其特征是在空間中分布稀疏,可以理解為:每個點都表達一定信息量,某個區域點越密集則可能信息量越大。噪聲信息屬于無用信息,信息量較小。所以離群點表達的信息可以忽略不計??紤]到離群點的特征,則可以定義某處點云小于某個密度,既點云無效。計算每個點到其最近的k(設定)個點平均距離。則點云中所有點的距離應構成高斯分布。給定均值與方差,可剔除n個∑之外的點
? ? ? 激光掃描通常會產生密度不均勻的點云數據集,另外測量中的誤差也會產生稀疏的離群點,此時,估計局部點云特征(例如采樣點處法向量或曲率變化率)時運算復雜,這會導致錯誤的數值,反過來就會導致點云配準等后期的處理失敗。
????解決辦法:對每個點的鄰域進行一個統計分析,并修剪掉一些不符合標準的點。具體方法為在輸入數據中對點到臨近點的距離分布的計算,對每一個點,計算它到所有臨近點的平均距離(假設得到的結果是一個高斯分布,其形狀是由均值和標準差決定),那么平均距離在標準范圍之外的點,可以被定義為離群點并從數據中去除。
具體查看論文:
R. B. Rusu, Z. C. Marton, N. Blodow, M. Dolha, and M. Beetz. Towards 3D Point Cloud Based Object Maps for Household Environments Robotics and Autonomous Systems Journal (Special Issue on Semantic Knowledge), 2008.
向上滑動閱覽
// 創建點云對象 指針
????pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
????pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
????// 創建濾波器,對每個點分析的臨近點的個數設置為50 ,并將標準差的倍數設置為1??這意味著如果一個點的距離超出了平均距離一個標準差以上,則該點被標記為離群點,并將它移除,存儲起來
????pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;//創建濾波器對象
????sor.setInputCloud (cloud);????????????????????????//設置待濾波的點云
????sor.setMeanK (50);??????????????????????????????? //設置在進行統計時考慮查詢點臨近點數
????sor.setStddevMulThresh (1.0);???????????????????? //設置判斷是否為離群點的閥值
????sor.filter (*cloud_filtered);???????????????????? //存儲
class??pcl::ShadowPoints< PointT, NormalT >
去除出現在邊緣不連續處的鬼點
class??pcl::SamplingSurfaceNormal< PointT >
將輸入空間劃分為網格,直到每個網格包含最多N個點,并在每個網格內隨機采樣點,使用每個網格的N個點來計算法線。在網格內采樣的所有點都被賦予相同的法線。以上兩個模塊的代碼來自于 libpointmatcher (https://github.com/ethz-asl/libpointmatcher)
class??pcl::RandomSample< PointT >
具有均勻概率的隨機采樣類。具體可查看論文
Faster Methods for Random Sampling
向上滑動閱覽
CentroidPoint<pcl::PointXYZ> centroid;
centroid.add (pcl::PointXYZ (1, 2, 3);
centroid.add (pcl::PointXYZ (5, 6, 7);??
? //這里是在centroid點集中加兩個點
pcl::PointXYZ c1;?
centroid.get (c1);? ?//直接使用get函數獲取該點集的在每個字段的均值
// 得到的結果是: c1.x == 3, c1.y == 4, c1.z == 5
// 我們也可以申明一個不一樣字段的點云來存儲結果
pcl::PointXYZRGB c2;
centroid.get (c2);
// 其中x,y,z字段的結果還是: c2.x == 3, c2.y == 4, c2.z == 5,
// 但是 c2.rgb 是不被觸及的
class??pcl::RadiusOutlierRemoval< PointT >
? ? ?球半徑濾波器與統計濾波器相比更加簡單粗暴。以某點為中心 畫一個球計算落在該球內的點的數量,當數量大于給定值時,則保留該點,數量小于給定值則剔除該點。此算法運行速度快,依序迭代留下的點一定是最密集的,?但是球的半徑和球內點的數目都需要人工指定。
向上滑動閱覽
/ 創建點云對象 指針
??pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
??pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
??// 源點云讀取 獲取 后
??pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;??//創建濾波器
??outrem.setInputCloud(cloud);????//設置輸入點云
??outrem.setRadiusSearch(0.8);????//設置半徑為0.8的范圍內找臨近點
??outrem.setMinNeighborsInRadius (2);//設置查詢點的鄰域點集數小于2的刪除
??????// apply filter
??outrem.filter (*cloud_filtered);//執行條件濾波??在半徑為0.8 在此半徑內必須要有兩個鄰居點,此點才會保存
以上就是濾波模塊的主要內容,大家可以留言補充內容,并可以分享你的總結到群主郵箱dianyunpcl@163.com
資源
三維點云論文及相關應用分享
【點云論文速讀】基于激光雷達的里程計及3D點云地圖中的定位方法
3D目標檢測:MV3D-Net
三維點云分割綜述(上)
3D-MiniNet: 從點云中學習2D表示以實現快速有效的3D LIDAR語義分割(2020)
win下使用QT添加VTK插件實現點云可視化GUI
JSNet:3D點云的聯合實例和語義分割
大場景三維點云的語義分割綜述
PCL中outofcore模塊---基于核外八叉樹的大規模點云的顯示
基于局部凹凸性進行目標分割
基于三維卷積神經網絡的點云標記
點云的超體素(SuperVoxel)
基于超點圖的大規模點云分割
更多文章可查看:點云學習歷史文章大匯總
SLAM及AR相關分享
【開源方案共享】ORB-SLAM3開源啦!
【論文速讀】AVP-SLAM:自動泊車系統中的語義SLAM
【點云論文速讀】StructSLAM:結構化線特征SLAM
SLAM和AR綜述
常用的3D深度相機
AR設備單目視覺慣導SLAM算法綜述與評價
SLAM綜述(4)激光與視覺融合SLAM
Kimera實時重建的語義SLAM系統
SLAM綜述(3)-視覺與慣導,視覺與深度學習SLAM
易擴展的SLAM框架-OpenVSLAM
高翔:非結構化道路激光SLAM中的挑戰
SLAM綜述之Lidar SLAM
基于魚眼相機的SLAM方法介紹
往期線上分享錄播匯總
第一期B站錄播之三維模型檢索技術
第二期B站錄播之深度學習在3D場景中的應用
第三期B站錄播之CMake進階學習
第四期B站錄播之點云物體及六自由度姿態估計
第五期B站錄播之點云深度學習語義分割拓展
第六期B站錄播之Pointnetlk解讀
[線上分享錄播]點云配準概述及其在激光SLAM中的應用
[線上分享錄播]cloudcompare插件開發
[線上分享錄播]基于點云數據的?Mesh重建與處理
[線上分享錄播]機器人力反饋遙操作技術及機器人視覺分享
[線上分享錄播]地面點云配準與機載點云航帶平差
點云PCL更多活動請查看:點云PCL活動之應屆生校招群
掃描下方微信視頻號二維碼可查看最新研究成果及相關開源方案的演示:
如果你對本文感興趣,請點擊“原文閱讀”獲取知識星球二維碼,務必按照“姓名+學校/公司+研究方向”備注加入免費知識星球,免費下載pdf文檔,和更多熱愛分享的小伙伴一起交流吧!
掃描二維碼
? ? ? ? ? ? ? ? ? ?關注我們
讓我們一起分享一起學習吧!期待有想法,樂于分享的小伙伴加入免費星球注入愛分享的新鮮活力。分享的主題包含但不限于三維視覺,點云,高精地圖,自動駕駛,以及機器人等相關的領域。
分享及合作方式:可聯系微信“920177957”(需要按要求備注)聯系郵箱:dianyunpcl@163.com,歡迎企業來聯系公眾號展開合作。
點一下“在看”你會更好看耶
總結
以上是生活随笔為你收集整理的pcl_filters模块api代码解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【论文速读】基于图像的伪激光雷达三维目标
- 下一篇: PCL中Kd树理论