#include <iostream>
#include <pcl/point_types.h>
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/conditional_removal.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>
int
main (int argc, char** argv)
{
if (argc != 2)
{
std::cerr << "please specify command line arg '-r' or '-c'" << std::endl;
exit(0);
}
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
// 填入点云数据
cloud->width = 1000;
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);
}
if (strcmp(argv[1], "-r") == 0)
{
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
// 创建滤波器
outrem.setInputCloud(cloud);
outrem.setRadiusSearch(50); //在半径为100的范围内搜索领近点
outrem.setMinNeighborsInRadius(30);//设置查询点的邻近点集数小于3的删除
// 应用滤波器
outrem.filter(*cloud_filtered);
}
//用户使用CondtionalRemoval滤波器,
else if (strcmp(argv[1], "-c") == 0)
{
// 创建环境 GT表示大于等于,LT表示小于等于 该比较算子大于等于0小于等于0.8
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, 100.0)));
range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new
pcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::LT, 200.0)));
// 创建滤波器
pcl::ConditionalRemoval<pcl::PointXYZ> condrem;
condrem.setCondition(range_cond);
condrem.setInputCloud (cloud);
condrem.setKeepOrganized(true);//保持点云的结构
// 应用滤波器
condrem.filter (*cloud_filtered);
}
else
{
std::cerr << "please specify command line arg '-r' or '-c'" << std::endl;
exit(0);
}
std::cout << "输入的点云个数: " << cloud->points.size() << std::endl;
for (size_t i = 0; i < cloud->points.size(); ++i)
{
std::cout << cloud->points[i].x << " "
<< cloud->points[i].y << " "
<< cloud->points[i].z << std::endl;
}
std::cout << "输出的点云个数: " << cloud_filtered->points.size() << std::endl;
for (size_t i = 0; i < cloud->points.size(); ++i)
{
std::cout << cloud_filtered->points[i].x << " "
<< cloud_filtered->points[i].y << " "
<< cloud_filtered->points[i].z << std::endl;
}
pcl::visualization::PCLVisualizer viewer1;
pcl::visualization::PCLVisualizer viewer2;
viewer1.addPointCloud(cloud);
viewer2.addPointCloud(cloud_filtered);
while (!viewer1.wasStopped())
{
viewer1.spinOnce(100);
viewer1.spinOnce(100);
}
return (0);
}