點云數(shù)據(jù)濾波處理(PCL實現(xiàn))
1.濾波器介紹
點云目標(biāo)識別的流程:數(shù)據(jù)采集->濾波->點云分割->點云識別,數(shù)據(jù)采集可以通過RGBD相機(jī)或者激光雷達(dá)等設(shè)備采集。由于采集設(shè)備精度,環(huán)境因素,光照因素,物體表面性質(zhì)等影響,會導(dǎo)致點云數(shù)據(jù)不可避免的出現(xiàn)噪音。濾波過程就是為了解決點云數(shù)據(jù)密度不規(guī)則不平滑,離群點,大數(shù)據(jù)降采樣,空洞,噪聲數(shù)據(jù)等問題。
點云數(shù)據(jù)濾波處理(PCL實現(xiàn))
主要的濾波器
直通濾波器,體素濾波器,統(tǒng)計濾波器,半徑濾波器,雙邊濾波器,中值濾波,卷積濾波,高斯濾波,條件濾波
雙邊濾波器:
直通濾波器:就是設(shè)置一個x、y、z方向的一個取值范圍,以過濾掉明顯不在測試距離范圍的點云;使用Intel RealSense或者激光雷達(dá)采集的數(shù)據(jù),可設(shè)置一個x,y,z合理的范圍,過濾掉我們不需要的點云。
體素濾波器:如果使用高分辨率相機(jī)等設(shè)備對點云進(jìn)行采集,往往點云會較為密集。過多的點云數(shù)量會對后續(xù)分割工作帶來困難。體素格濾波器可以達(dá)到向下采樣同時不破壞點云本身幾何結(jié)構(gòu)的功能。點云幾何結(jié)構(gòu)不僅是宏觀的幾何外形,也包括其微觀的排列方式,比如橫向相似的尺寸,縱向相同的距離。
統(tǒng)計濾波器:用于去除明顯離群點(離群點往往由測量噪聲引入)。其特征是在空間中分布稀疏,可以理解為:每個點都表達(dá)一定信息量,某個區(qū)域點越密集則可能信息量越大。噪聲信息屬于無用信息,信息量較小。所以離群點表達(dá)的信息可以忽略不計。考慮到離群點的特征,則可以定義某處點云小于某個密度,既點云無效。計算每個點到其最近的k個點平均距離。則點云中所有點的距離應(yīng)構(gòu)成高斯分布。
半徑濾波:半徑濾波器與統(tǒng)計濾波器相比更加簡單粗暴。以某點為中心畫一個圓計算落在該圓中點的數(shù)量,當(dāng)數(shù)量大于給定值時,則保留該點,數(shù)量小于給定值則剔除該點。此算法運行速度快,依序迭代留下的點一定是最密集的,但是圓的半徑和圓內(nèi)點的數(shù)目都需要人工指定。
2. PCL濾波器源碼
2.1 直通濾波器
直通濾波器代碼演示:首先從文件中加載一個自行車模型,可視化后
#include "stdafx.h"
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/filters/bilateral.h>
#include <pcl/filters/fast_bilateral.h>
#include <pcl/filters/fast_bilateral_omp.h>
#include <pcl/filters/radius_outlier_removal.h>
using namespace std;
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPLYFile<pcl::PointXYZ>("Bicycle.ply", *cloud) == -1) //* load the file
{
PCL_ERROR("Couldn't read file test_pcd.pcd \n");
system("PAUSE");
return (-1);
}
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud(cloud);
pass.setFilterFieldName("z");
pass.setFilterLimits(0.0, 2.4); //設(shè)置Z軸范圍為0.0到2.4m
pass.filter(*cloud_filtered);
//顯示濾波前的點云
pcl::visualization::PCLVisualizer viewer("passthrough viewer");
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud_filtered, "z");//按照z字段進(jìn)行渲染
viewer.addPointCloud(cloud_filtered, fildColor, "origin cloud");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "origin clouds");
while (!viewer.wasStopped()) {
viewer.spinOnce();
}
return (0);
}
通過設(shè)置調(diào)用pass.setFilterLimits(0.0, 2.4); 設(shè)置Z軸范圍為0.0到2.4m,將大于2.4m的全部過濾掉。效果如下(自行車后面的墻體被裁剪掉):
2.2 體素濾波器
體素濾波器方法這邊只粘貼關(guān)鍵代碼,其他代碼上面已經(jīng)提供
pcl::VoxelGrid<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
sor.setLeafSize(0.01f, 0.01f, 0.01f);//設(shè)置體素大小,米為單位
sor.filter(*cloud_filtered);
2.3 統(tǒng)計濾波器
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
sor.setMeanK(5);
sor.setStddevMulThresh(1.0);
sor.filter(*cloud_filtered);
濾波后的點云明顯去除了飛點
2.4 半徑濾波
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
outrem.setInputCloud(cloud);
outrem.setRadiusSearch(0.01);
outrem.setMinNeighborsInRadius(5);
outrem.filter(*cloud_filtered);
會將PCL所有濾波器全部演示一次,未完待續(xù)...