C++版本:
#include <pcl/point_types.h>
#include <pcl/filters/filter.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/io/pcd_io.h>
typeef pcl::PointCloud<pcl::PointXYZ> PointCloud;
int main (int argc, char** argv)
{
PointCloud::Ptr cloud (new PointCloud);
PointCloud::Ptr src (new PointCloud);
PointCloud::Ptr srcc (new PointCloud);
if(pcl::io::loadPCDFile(argv[1], *cloud)==-1) {
PCL_ERROR("Couldn't read that pcd file\n"); return(-1);}
//----VoxelGrid对一个给定点云进行下采样和滤波
pcl::VoxelGrid<pcl::PointXYZ> grid;
grid.setLeafSize (0.05, 0.05, 0.05); //设置体元网格的叶子大小
grid.setInputCloud (cloud);
grid.filter (*src); //下采样和滤波,并保存
//----使用statisticalOutlierRemoval滤波器移除离群点
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud (src);
sor.setMeanK (50); //设置在进行统计时考虑查询点临近点数
sor.setStddevMulThresh (0.5); //设置判断是否为离群点的阀值
sor.filter (*srcc);
//----使用RadiusOutlinerRemoval移除离群点,设定每个点一定范围内周围至少有足够多的近邻,不满足就会被删除
pcl::RadiusOutlierRemoval<pcl::PointXYZI> outrem;
outrem.setInputCloud(srcc); //设置输入点云
outrem.setRadiusSearch(0.1); //设置半径为0.8的范围内找临近点
outrem.setMinNeighborsInRadius (10); //设置查询点的邻域点集数小于2的删除
outrem.filter (*cloud);
pcl::io::savePCDFileASCII ("filter.pcd",*cloud);
}
编译成功了,运行时总出现以下错误,目前找不到原因:段错误 (核心已转储)
python-pcl版本
#网格滤波
#!/usr/bin/env python3
import sys
import pcl
text=sys.argv[1]
print("Start voxel grid filter:")
p = pcl.load(text)
fil=p.make_ApproximateVoxelGrid()
fil.set_leaf_size(0.01, 0.01, 0.01)
text0=fil.filter()
pcl.save(fil.filter(), "voxel_"+text)
#移除离群点滤波
#!/usr/bin/env python3
import sys
import pcl
text=sys.argv[1]
print("Start statistical outlier filter:")
p = pcl.load(text)
fil = p.make_statistical_outlier_filter()
fil.set_mean_k(50)
fil.set_std_dev_mul_thresh(2)
pcl.save(fil.filter(), "static_"+text)
print("static:","static_"+text)