PCL:ConditionRemoval 条件滤波(坐标约束 | 强度约束)
Posted 没事就要敲代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PCL:ConditionRemoval 条件滤波(坐标约束 | 强度约束)相关的知识,希望对你有一定的参考价值。
1 条件滤波的原理
筛选满足特定条件的点云数据。有两种类型的条件:
- ConditionAnd:所有条件都要满足
- ConditionOr:满足一个条件即可
可以设置一个或多个条件对象,并为条件对象添加比较算子。条件比较算子包含三项:
- 名称:对应于点云XYZ字段名称(x|y|z)、强度字段(intensity)等。
- 比较运算符:GT、GE、LT、LE、EQ
运算符 | 含义 |
---|---|
GT | greater than 大于 |
GE | greater than or equal 大于等于 |
LT | less than 小于 |
LE | less than or equal 小于等于 |
EQ | equal 等于 |
2 代码实现
下面将点云做以下条件约束的滤波
- 条件1:保留y坐标在 [ 2.0 , 6.0 ] [2.0,6.0] [2.0,6.0] 范围内的点
- 条件2:保留强度 i n t e n s i t y > 150 intensity>150 intensity>150 的点
代码:
#include <pcl/io/pcd_io.h>
#include <pcl/filters/conditional_removal.h>
using namespace std;
typedef pcl::PointXYZI PointT;
typedef pcl::PointCloud<PointT> PointCloudT;
int main()
//-------------------------- 加载点云 --------------------------
cout << "->正在加载点云..." << endl;
PointCloudT::Ptr cloud(new PointCloudT);
if (pcl::io::loadPCDFile("XYZI.pcd", *cloud) < 0)
PCL_ERROR("\\a->点云文件不存在!\\n");
system("pause");
return -1;
cout << "->加载点云点数:" << cloud->points.size() << endl;
//========================== 加载点云 ==========================
//-------------------------- 条件滤波 --------------------------
pcl::ConditionAnd<PointT>::Ptr range_cond(new pcl::ConditionAnd<PointT>());
range_cond->addComparison(pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT>("y", pcl::ComparisonOps::GT, 2.0)));
range_cond->addComparison(pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT>("y", pcl::ComparisonOps::LT, 6.0)));
range_cond->addComparison(pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT>("intensity", pcl::ComparisonOps::GT, 150.0)));
//创建滤波器
pcl::ConditionalRemoval<PointT> condrem;
condrem.setCondition(range_cond);
condrem.setInputCloud(cloud);
condrem.setKeepOrganized(true);
//执行条件滤波
PointCloudT::Ptr cloud_filtered(new PointCloudT);
condrem.filter(*cloud_filtered);
//========================== 条件滤波 ==========================
//------------------------ 保存滤波点云 ------------------------
pcl::io::savePCDFileBinary("condY.pcd", *cloud_filtered);
//======================== 保存滤波点云 ========================
return 0;
3 结果展示
4 比较运算符源码
switch (this->op_)
case pcl::ComparisonOps::GT :
return (compare_result > 0);
case pcl::ComparisonOps::GE :
return (compare_result >= 0);
case pcl::ComparisonOps::LT :
return (compare_result < 0);
case pcl::ComparisonOps::LE :
return (compare_result <= 0);
case pcl::ComparisonOps::EQ :
return (compare_result == 0);
default:
PCL_WARN ("[pcl::FieldComparison::evaluate] unrecognized op_!\\n");
return (false);
测试数据下载:XYZI.pcd ----- 提取码:pdx6(感谢老铁的关注!)
以上是关于PCL:ConditionRemoval 条件滤波(坐标约束 | 强度约束)的主要内容,如果未能解决你的问题,请参考以下文章
点云处理技术之PCL滤波器——离群点滤波(statisticalOutlierRemovalConditionalRemoval 和RadiusOutlinerRemoval)