PCL1.8.1 滤波

喜欢而已 提交于 2019-12-05 18:57:37

直通滤波器

指定点云中特定字段域的数字范围,保留或剔除操作

http://pointclouds.org/documentation/tutorials/passthrough.php#passthrough

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

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);

// Create the filtering object
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud (cloud);

//设置pcl::PointXYZ中字段域z
pass.setFilterFieldName ("z");
pass.setFilterLimits (0.0, 1.0);
//默认是false,表示保留z字段是0.0-1.0的点云数据  true:不保留
pass.setFilterLimitsNegative (true);
pass.filter (*cloud_filtered);

VoxelGrid滤波器

使用三维立体方格进行方格的重心估计,每个方格只保留一个点,因此使用的方格越大则剔除的点数越多。

http://pointclouds.org/documentation/tutorials/voxel_grid.php#voxelgrid

#include <pcl/filters/voxel_grid.h>


pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ());
pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());

// Create the filtering object
pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
sor.setInputCloud(cloud);
//设置方格大小为1立方厘米
sor.setLeafSize(0.01f, 0.01f, 0.01f);
sor.filter(*cloud_filtered);

基于统计的滤波

对于一个点的邻域进行统计分析,并修剪掉那些不符合标准的点,该滤波基于邻近点的距离,在范围K个点中计算平均距离,将小于或大于该距离的点剔除或保留。

http://pointclouds.org/documentation/tutorials/statistical_outlier.php#statistical-outlier-removal

#include <pcl/filters/statistical_outlier_removal.h>

// Create the filtering object
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
//设置周边50个点进行统计
sor.setMeanK(50);
//如果一个点的平均距离大于1.0则剔除
sor.setStddevMulThresh(1.0);
sor.filter(*cloud_filtered);

//保存在1.0范围内的点集
pcl::PLYWriter writer;
writer.write<pcl::PointXYZ>("test_Static_inliners.ply", *cloud_filtered, false);

//保存在1.0范围外的点集
sor.setNegative(true);
sor.filter(*cloud_filtered);
writer.write<pcl::PointXYZ>("test_Static_outliers.ply", *cloud_filtered, false);

 投影点云到平面

将点云投影到一个平面上,下面程序中将点云投影到z=0即xoy平面。

http://pointclouds.org/documentation/tutorials/project_inliers.php#project-inliers

#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>);

// Create a set of planar coefficients with X=Y=0,Z=1
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;

// Create the filtering object
pcl::ProjectInliers<pcl::PointXYZ> proj;
proj.setModelType (pcl::SACMODEL_PLANE);
proj.setInputCloud (cloud);
proj.setModelCoefficients (coefficients);
proj.filter (*cloud_projected);

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!