PCL:ConditionRemoval 条件滤波(坐标约束 | 强度约束)

Posted 没事就要敲代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PCL:ConditionRemoval 条件滤波(坐标约束 | 强度约束)相关的知识,希望对你有一定的参考价值。

1 条件滤波的原理

筛选满足特定条件的点云数据。有两种类型的条件:

  1. ConditionAnd:所有条件都要满足
  2. ConditionOr:满足一个条件即可

可以设置一个或多个条件对象,并为条件对象添加比较算子。条件比较算子包含三项:

  1. 名称:对应于点云XYZ字段名称(x|y|z)、强度字段(intensity)等。
  2. 比较运算符:GT、GE、LT、LE、EQ
运算符含义
GTgreater than 大于
GEgreater than or equal 大于等于
LTless than 小于
LEless than or equal 小于等于
EQequal 等于

2 代码实现

下面将点云做以下条件约束的滤波

  • 条件1:保留y坐标在 [ 2.0 , 6.0 ] [2.0,6.0] [2.06.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 结果展示

图1 原始点云(按强度渲染)

图2 满足Y坐标在区间 [2.0,6.0]的点云

图3 满足Y坐标在区间 [2.0,6.0]、强度intensity>150的点云

图4 叠加显示,红色为原始点云,黄色为限制y字段的点云,绿色为限制y字段和intensity字段的点云

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)

点云处理技术之PCL滤波器——体素滤波器(pcl::VoxelGrid)

PCL:PassThrough ❤️ 直通滤波

PCL 滤波采样——统计学滤波

PCL 滤波采样——统计学滤波

[PCL]点云渐进形态学滤波