开发环境:Visual Studio 2017
PCL版本:PCL 1.8.1
1.点云直通滤波
点云直通滤波源代码:(滤波参数根据实际情况调整)
#include <iostream>
#include <vector>
#include <math.h>
#include <pcl/common/transforms.h>
#include <pcl/common/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/filters/radius_outlier_removal.h> //半径滤波器头文件
#include <pcl/filters/voxel_grid.h>//体素滤波器头文件
#include <pcl/filters/passthrough.h> //直通滤波器头文件
#include <pcl/filters/statistical_outlier_removal.h> //统计滤波器头文件
#include <pcl/filters/conditional_removal.h> //条件滤波器头文件
int main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr src_xyz(new pcl::PointCloud<pcl::PointXYZ>);//原始点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_pass_filtered(new pcl::PointCloud<pcl::PointXYZ>);//直通滤波后点云
if (-1 == pcl::io::loadPLYFile("E:/bishe/radius_filter_20_3.ply", *src_xyz))
{
cout << "Error Load Src File!\n" << endl;
return -1;
}
else cout << "Load Src File Success!\n" << endl;
cout << "Src Point Cloud Point Numbers: " << src_xyz->points.size() << "\n" << endl;//输出原始点云数量
//直通滤波,指定x轴方向
pcl::PassThrough<pcl::PointXYZ> pass;//创建直通滤波器
pass.setInputCloud(src_xyz);//输入点云
pass.setFilterFieldName("x");//设置滤波的方向x轴
pass.setFilterLimits(-10, 10);//滤除在z轴方向上不在0.0-0.1范围内的所有点
//pass.setFilterLimitsNegative (true);//默认false,保留内部
pass.filter(*cloud_pass_filtered);//滤波结果输出
cout << "cloud_pass_filtered Point Cloud Point Numbers: " << cloud_pass_filtered->points.size() << "\n" << endl;
//直通滤波,指定y轴方向
pcl::PassThrough<pcl::PointXYZ> pass2;//创建直通滤波器
pass.setInputCloud(cloud_pass_filtered);//输入点云
pass.setFilterFieldName("y");//设置滤波的方向y轴
pass.setFilterLimits(-10, 10);//滤除在z轴方向上不在0.0-0.1范围内的所有点
//pass.setFilterLimitsNegative (true);//默认false,保留内部
pass.filter(*cloud_pass_filtered);//滤波结果输出
cout << "cloud_pass_filtered Point Cloud Point Numbers: " << cloud_pass_filtered->points.size() << "\n" << endl;
//点云可视化
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
int v1;
viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
viewer->addCoordinateSystem(10, v1);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> red(src_xyz, 255, 0, 0);
viewer->addPointCloud(src_xyz, red, "src", v1);
int v2;
viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
viewer->addCoordinateSystem(10, v2);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> green(cloud_pass_filtered, 0, 255, 0);
viewer->addPointCloud(cloud_pass_filtered, green, "cloud_filtered", v2);
//pcl::io::savePLYFile("E:/vc2017project/cloud_pass_filter.ply", *cloud_pass_filtered);//存储直通滤波后的点云
while (!viewer->wasStopped())
{
viewer->spinOnce();
}
cout << "Filter Success!\n" << endl;
return 0;
}
分别对点云的x轴和y轴进行滤波,滤波效果:
2.点云半径滤波
点云半径滤波主程序源代码:(滤波参数根据实际情况调整)
int main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr src_xyz(new pcl::PointCloud<pcl::PointXYZ>);//原始点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_radius_filter(new pcl::PointCloud<pcl::PointXYZ>);//半径滤波后的点云
if (-1 == pcl::io::loadPLYFile("E:/vc2017project/src.ply", *src_xyz))
{
cout << "Error Load Src File!\n" << endl;
return -1;
}
else cout << "Load Src File Success!\n" << endl;
cout << "Src Point Cloud Point Numbers: " << src_xyz->points.size() << "\n" << endl;//输出原始点云数量
//半径滤波
pcl::RadiusOutlierRemoval<pcl::PointXYZ> radiusoutlier; //创建半径滤波器
radiusoutlier.setInputCloud(src_xyz); //输入点云
radiusoutlier.setRadiusSearch(0.5); //搜索半径
radiusoutlier.setMinNeighborsInRadius(5);//邻域点阈值
radiusoutlier.filter(*cloud_radius_filter);
cout << "cloud_radius_filter Point Cloud Point Numbers: " << cloud_radius_filter->points.size() << "\n" << endl;
//点云可视化
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
int v1;
viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
viewer->addCoordinateSystem(10, v1);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> red(src_xyz, 255, 0, 0);
viewer->addPointCloud(src_xyz, red, "src", v1);
int v2;
viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
viewer->addCoordinateSystem(10, v2);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> green(cloud_radius_filter, 0, 255, 0);
viewer->addPointCloud(cloud_radius_filter, green, "cloud_filtered", v2);
//pcl::io::savePLYFile("E:/vc2017project/cloud_radius_filter.ply", *cloud_radius_filter);//存储半径滤波后的点云
while (!viewer->wasStopped())
{
viewer->spinOnce();
}
cout << "Filter Success!\n" << endl;
return 0;
}
半径滤波效果:
3.点云统计滤波
点云统计滤波主程序源代码:(滤波参数根据实际情况调整)
int main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr src_xyz(new pcl::PointCloud<pcl::PointXYZ>);//原始点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_statistic_filter(new pcl::PointCloud<pcl::PointXYZ>);//半径滤波后的点云
if (-1 == pcl::io::loadPLYFile("E:/vc2017project/src.ply", *src_xyz))
{
cout << "Error Load Src File!\n" << endl;
return -1;
}
else cout << "Load Src File Success!\n" << endl;
cout << "Src Point Cloud Point Numbers: " << src_xyz->points.size() << "\n" << endl;//输出原始点云数量
//统计滤波
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; //创建滤波器对象
sor.setInputCloud(src_xyz); //输入点云
sor.setMeanK(7); //近邻点个数
sor.setStddevMulThresh(0.5);//设置标准差乘数
sor.filter(*cloud_statistic_filter);//保存滤波结果
cout << "cloud_statistic_filter Point Cloud Point Numbers: " << cloud_statistic_filter->points.size() << "\n" << endl;
//点云可视化
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
int v1;
viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
viewer->addCoordinateSystem(10, v1);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> red(src_xyz, 255, 0, 0);
viewer->addPointCloud(src_xyz, red, "src", v1);
int v2;
viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);
viewer->addCoordinateSystem(10, v2);
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> green(cloud_statistic_filter, 0, 255, 0);
viewer->addPointCloud(cloud_statistic_filter, green, "cloud_filtered", v2);
//pcl::io::savePLYFile("E:/bishe/tongji_filter_15_5.ply", *cloud_tongji_filter);
while (!viewer->wasStopped())
{
viewer->spinOnce();
}
cout << "Filter Success!\n" << endl;
return 0;
}
统计滤波效果: