拷贝代码可直接运行
一、 代码
#include <iostream>
#include <string>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/conditional_removal.h>
using namespace std;
pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_filter_condition(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in,
float para_min, float para_max, string axis)
{
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>(axis, pcl::ComparisonOps::GT, para_min)));
range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new
pcl::FieldComparison<pcl::PointXYZ>(axis, pcl::ComparisonOps::LT, para_max)));
// 使用条件滤波器
pcl::ConditionalRemoval<pcl::PointXYZ> condrem; // 创建条件滤波器
condrem.setCondition(range_cond); // 并用条件定义对象初始化
condrem.setInputCloud(cloud_in); // 输入点云
condrem.setKeepOrganized(false); // 设置true则保持点云的结构,保存原有点云结结构就是点的数目没有减少,采用nan代替了。
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>());
condrem.filter(*cloud_out); // 不在条件范围内的点 被替换为 nan
return cloud_out;
}
//test------------//
int main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile(argv[1],*cloud);
auto cloud_out = pcl_filter_condition(cloud,0,70,"x");
cout << "采样前点数:" << cloud->size() << endl;
cout << "采样后点数:" << cloud_out->size() << endl;
system("pause");
return 0;
}