精华内容
下载资源
问答
  • 点云滤波---条件滤波器

    千次阅读 2019-06-22 16:22:31
    点云滤波---条件滤波器适用对象工作原理PCL核心代码实现参考资料 适用对象 滤除离群点的一种滤波方法。 工作原理 通过设定滤波条件进行滤波,删除点云中不符合用户指定的一个或多个条件的点。 PCL核心代码实现 //...

    适用对象

    滤除离群点的一种滤波方法。

    工作原理

    通过设定滤波条件进行滤波,删除点云中不符合用户指定的一个或多个条件的点。

    PCL核心代码实现

    //创建条件对象
    pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond (new pcl::ConditionAnd<pcl::PointXYZ> ());
    /*
    //比较条件符号说明:
    //GT greater than
    //EQ equal
    //LT less than
    //GE greater than or equal
    //LE less than or equal
    */
    //添加比较条件1:z>0.0
    range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new pcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::GT, 0.0)));
    //添加比较条件2:z<0.8
    range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new pcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::LT, 0.8)));
    
    
    pcl::ConditionalRemoval<pcl::PointXYZ> condrem;	//创建条件滤波器对象
    condrem.setCondition (range_cond);				//设置条件
    condrem.setInputCloud (cloud);					//设置输入点云
    condrem.setKeepOrganized(true);					//设置保持点云的结构
    condrem.filter (*cloud_filtered);				//执行滤波
    
    

    condrem.setKeepOrganized( )详解:
    设置受保持点云的结构。
    有序点云执行滤波之后,希望仍然能够保持有序性
    若设置为true,再通过setuserFilterValue设置一个指定的值,被滤除的点将会被用户指定的值代替。
    若设置为true,没有通过setuserFilterValue设置一个指定的值,则用nan填充被滤除的点
    若设置为false,则直接将滤除的点删除,从而可能改变点云的组织结构

    完整代码将与半径滤波器一起给出。查看点云滤波—半径滤波器

    参考资料

    Removing outliers using a Conditional or RadiusOutlier removal

    展开全文
  • PCL 条件滤波器

    万次阅读 2021-02-24 15:53:21
    ConditionalRemoval条件滤波器,可以一次删除满足对输入的点云设定的一个或多个条件指标的所有的数据点,删除点云中不符合用户指定的一个或者多个条件的数据点。

    一、算法原理

    1、原理概述

    ConditionalRemoval:条件滤波器
      ConditionalRemoval过滤满足特定条件的数据。 可以一次删除满足对输入的点云设定的一个或多个条件指标的所有的数据点,删除点云中不符合用户指定的一个或者多个条件的数据点,用户必须为ConditionalRemoval提供条件。

    2、参考文献

    [1] doc:Removing outliers using a Conditional
    [2] PCL中的pcl::ConditionalRemoval类实现了该算法

    • 有两种类型的条件:
    1. ConditionAnd ——pcl::ConditionAnd
    2. ConditionOr——pcl::ConditionOr

    二、代码实现

    #include <iostream>
    #include <pcl/point_types.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/filters/conditional_removal.h> //条件滤波
    #include <pcl/visualization/pcl_visualizer.h>
    #include <boost/thread/thread.hpp>
    
    
    void VisualizeCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr& filter_cloud) {
        //-----------------------显示点云-----------------------
        boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("显示点云"));
    
        int v1(0), v2(0);
        viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);
        viewer->setBackgroundColor(0, 0, 0, v1);
        viewer->addText("point clouds", 10, 10, "v1_text", v1);
        viewer->createViewPort(0.5, 0.0, 1, 1.0, v2);
        viewer->setBackgroundColor(0.1, 0.1, 0.1, v2);
        viewer->addText("filtered point clouds", 10, 10, "v2_text", v2);
        // 按照z字段进行渲染,将z改为x或y即为按照x或y字段渲染
        pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "z");
        viewer->addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample cloud", v1);
    
        viewer->addPointCloud<pcl::PointXYZ>(filter_cloud, "cloud_filtered", v2);
        viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 1, 0, "cloud_filtered", v2);
        //viewer->addCoordinateSystem(1.0);
        //viewer->initCameraParameters();
        while (!viewer->wasStopped())
        {
            viewer->spinOnce(100);
            boost::this_thread::sleep(boost::posix_time::microseconds(100000));
        }
    }
    
    
    using namespace std;
    int main(int argc, char** argv) {
    
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>);
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_conditional(new pcl::PointCloud<pcl::PointXYZ>);
       
        if (pcl::io::loadPCDFile<pcl::PointXYZ>("Test.pcd", *cloud_in) != 0)
        {
            return -1;
        }
       
        cout << "读取点的个数为: " << cloud_in->size() << " points" << endl;
    
        //--------------创建滤波器并用条件定义对象初始化---------------
        // 1、定义条件滤波器所要使用的条件
        // (1.1)字段条件
        pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZ>);//实例化条件指针
        // 添加在Z字段上大于(pcl::ComparisonOps::GT great Then)13的比较算子
        range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new 
            pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::GT, 13.0)));
        // 添加在Z字段上小于(pcl::ComparisonOps::LT Lower Then)15的比较算子
        range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new 
            pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::LT, 15.0)));
       /* (1.2)曲率条件
         // 创建条件定义对象  曲率
       pcl::ConditionOr<PointNormal>::Ptr range_cond (new pcl::ConditionOr<PointNormal> () );
    
       range_cond->addComparison (pcl::FieldComparison<PointNormal>::ConstPtr (// 曲率 大于
        new pcl::FieldComparison<PointNormal>("curvature", pcl::ComparisonOps::GT, threshold))
        */
        // 2、使用条件滤波器
        pcl::ConditionalRemoval<pcl::PointXYZ> condrem; // 创建条件滤波器
        condrem.setCondition(range_cond);               // 并用条件定义对象初始化     
        condrem.setInputCloud(cloud_in);                // 输入点云
        condrem.setKeepOrganized(true);                 // 设置true则保持点云的结构,保存原有点云结结构就是点的数目没有减少,采用nan代替了。
                                                        // 设置为false则不需要 4、去除nan点的操作
         // 3、执行滤波
        condrem.filter(*cloud_conditional);             // 不在条件范围内的点 被替换为 nan
        
        cout << "去除空值之前,条件滤波后点的个数: " << cloud_conditional->size() << " points" << endl;
         // 4、去除nan点
        std::vector<int> mapping;
    
        pcl::removeNaNFromPointCloud(*cloud_conditional, *cloud_conditional, mapping);
        //pcl::io::savePCDFileASCII("cloud_conditional.pcd", *cloud_conditional);
        cout << "去除空值之后,条件滤波后点的个数: " << cloud_conditional->size() << " points" << endl;
      
        VisualizeCloud(cloud_in, cloud_conditional);
    
        return 0;
    }
    
    

    三、结果展示

    在这里插入图片描述

    读取点的个数为: 61603 points
    去除空值之前,条件滤波后点的个数: 61603 points
    去除空值之后,条件滤波后点的个数: 19282 points

    展开全文
  • 变步长自适应数字滤波器的稳定条件,肖扬,宋明艳,变步长自适应数字滤波器的权值随信号和噪声的变化自动调整时可能出现不稳定。为解决这一问题,本文提出变步长自适应数字滤波器
  • 各种滤波器

    2021-04-29 23:17:20
    本文主要介绍了以下几种滤波器: 1、passthrough(直通)滤波器 2、VoxelGrid(体素)滤波器 3、RadiusOutlierRemoval(半径)滤波器 4、StatisticalOutlierRemoval(统计)... 5、ConditionalRemoval(条件滤波器

    原理分析

      在点云数据的处理过程中,滤波处理是点云预处理的第一步,只有在滤波预处理中将噪声点、离群点、孔洞、数据压缩等按照后续处理定制,才能够更好地进行配准、特征提取、曲面重建、可视化等后续应用处理。PCL中点云滤波模块提供了很多滤波处理算法,例如双边滤波、高斯滤波、条件滤波、直通滤波、基于随机采样一致性滤波等。
      需要进行点云滤波处理的情况:
      以下三种情况都可以看作是滤波操作
      (1)噪声点、离群点
      在获取点云数据时,由于设备精度、操作者经验、环境因素等带来的影响,点云数据中将不可避免地出现一些噪声点,除了由于测量随机误差产生的噪声点外,由于受到外界干扰如视线遮挡障碍物等因素的影响,点云数据中往往还存在着一些远离主体点云的点,即离群点
      (2)因点云数据量太大需进行点云下采样,减少点云数量
      (3)点云数据密度不规则需要进行平滑处理

    代码示例

    1、使用passthrough(直通)滤波器对点云进行滤波处理

    #include <iostream>
    #include <ctime>
    #include <pcl/point_types.h>
    #include <pcl/filters/passthrough.h>
    using namespace std;
    int
    main()
    {
    	srand((unsigned int)time(NULL));//用系统时间初始化随机种子,防止每次随机数都一样
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);//定义并实例化一个PointCloud指针对象(滤波前)
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);//定义并实例化一个PointCloud指针对象(滤波后)
    
    	//1、利用随机数生成点云,作为滤波的输入点云数据,并将其打印到标准输出
    
    	cloud->width = 5;//点云数量
    	cloud->height = 1;//表示无序点云
    	cloud->points.resize(cloud->width * cloud->height);
    	//填充点云数据
    	for (size_t i = 0; i < cloud->points.size(); ++i)
    	{
    		cloud->points[i].x = rand() / (RAND_MAX + 1.0f);
    		cloud->points[i].y = rand() / (RAND_MAX + 1.0f);
    		cloud->points[i].z = rand() / (RAND_MAX + 1.0f) - 0.5;
    	}
    	//输出上一步填充的点云的坐标
    	cout<< "滤波前:" << endl;
    	for (size_t i = 0; i < cloud->points.size(); ++i)
    		cout<< "  " << cloud->points[i].x << " "
    		<< cloud->points[i].y << " "
    		<< cloud->points[i].z << endl;
    
    	//2、接下来创建直通滤波器的对象,设置它的参数,滤波字段设置为Z轴方向,可接受的范围是(0.0,1.0),
    	//即将点云中点的z坐标不在该范围内的删除或保留,由函数setFilterLimitsNegative决定
    
    	pcl::PassThrough<pcl::PointXYZ> pass;// 创建滤波器对象
    	pass.setInputCloud(cloud);//设置输入点云
    	pass.setFilterFieldName("z");//按照点云数据的Z字段(Z坐标)进行过滤
    	pass.setFilterLimits(0.0, 1.0);//设置在过滤字段的范围(z坐标0-1)
    	pass.setFilterLimitsNegative(true);//设置保留范围内还是过滤掉范围内, 默认为flase,可以注释掉。true为删除范围内的,flase为过滤掉范围外的
    	pass.filter(*cloud_filtered);//执行滤波,将完成过滤操作的点云数据保存在cloud_filtered中
    
    	//3、打印输出完成过滤操作后的点云的坐标
    
    	cout<< "滤波后:" << endl;
    	for (size_t i = 0; i < cloud_filtered->points.size(); ++i)
    		cout << "  " << cloud_filtered->points[i].x << " "
    		<< cloud_filtered->points[i].y << " "
    		<< cloud_filtered->points[i].z << endl;
    	system("pause");
    	return 0;
    }
    
    

    2、使用VoxelGrid(体素)滤波器对点云进行下采样

    #include <iostream>
    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/filters/voxel_grid.h>
    using namespace std;
    int
    main()
    {
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);//定义并实例化一个PointCloud指针对象(滤波前)
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);//定义并实例化一个PointCloud指针对象(滤波后)
    
    	//1、从磁盘中读取点云数据
    
    	pcl::PCDReader reader;// 读取PCD格式的点云数据
    	reader.read("hand.pcd", *cloud); // 把路径改为自己存放文件的路径,读取点云文件中的数据到cloud对象
    	cout << "滤波前: " << cloud->width * cloud->height
    		<< " data points (" << pcl::getFieldsList(*cloud) << ")." << endl;
    
    	//2、接下来创建一个大小为1cm的pcl::VoxelGrid滤波器,输入数据作为滤波器的输入,滤波后的数据储存到cloud_filtered中
    
    	pcl::VoxelGrid<pcl::PointXYZ> sor;// 创建滤波器对象
    	sor.setInputCloud(cloud);//给滤波对象设置需要过滤的点云
    	sor.setLeafSize(0.01f, 0.01f, 0.01f);//设置滤波时创建的体素大小为1cm的立方体
    	sor.filter(*cloud_filtered);//执行滤波处理,存储输出cloud_filtered
    	cout << "滤波后: " << cloud_filtered->width * cloud_filtered->height
    		<< " data points (" << pcl::getFieldsList(*cloud_filtered) << ")." << endl;
    
    	//3、最后将数据写入磁盘以做他用,例如可视化等
    
    	pcl::PCDWriter writer;
    	writer.write("2f.pcd", *cloud_filtered,false);//默认为false,保存为ASCII格式,true保存为二进制格式的点云(可省略)
    
    	system("pause");
    	return 0;
    }
    

    3、使用RadiusOutlierRemoval(半径)滤波器移除离群点

    #include <iostream>
    #include <pcl/point_types.h>
    #include <pcl/filters/radius_outlier_removal.h>
    using namespace std;
    
    int
    main()
    {
    	//1、我们首先定义了点云对象,并对其中一个赋予随机点数据
    
    	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 = 5;
    	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);
    	}
    
    	//2、然后创建RadiusOutlierRemoval滤波器对象,设置它的参数,并将其应用到我们输入的点云数据
    	
    	pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;// 创建滤波器对象
    	outrem.setInputCloud(cloud);//设置输入点云
    	outrem.setRadiusSearch(800);//设置在半径为800的范围内查找邻近点
    	outrem.setMinNeighborsInRadius(2);//在以查询点为圆心,800为半径的圆内,如果圆内点的个数小于2个,则删除该查询点
    	outrem.filter(*cloud_filtered);//执行半径滤波,存储结果到cloud_filtered中
    	
    	//3、打印输出滤波前和滤波后的点云坐标
    
    	cout << "滤波前: " << endl;
    	for (size_t i = 0; i < cloud->points.size(); ++i)
    		cout << "  " << cloud->points[i].x << " " << cloud->points[i].y << " " << cloud->points[i].z << endl;
    	cout << "滤波后: " << endl;
    	for (size_t i = 0; i < cloud_filtered->points.size(); ++i)
    		cout << "  " << cloud_filtered->points[i].x << " " << cloud_filtered->points[i].y << " " << cloud_filtered->points[i].z << endl;
    
    	system("pause");
    	return 0;
    }
    
    

    4、使用StatisticalOutlierRemoval(统计)滤波器移除离群

      统计滤波器是半径滤波器的升级版

    #include <iostream>
    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/filters/statistical_outlier_removal.h>
    using namespace std;
    int
    main()
    {
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
    	
    	//1、从磁盘中读入点云数据
    
    	pcl::PCDReader reader;//定义读取对象
    	reader.read("table_scene_lms400.pcd", *cloud);// 把路径改为自己存放文件的路径
    	cout << "滤波前: " << endl;
    	cout << *cloud << endl;
    	
    	//2、接着创建一个pcl::StatisticalOutlierRemoval滤波器,对每个点分析的临近点个数设为50,标准差倍数设为1
    	
    	pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; //创建滤波器对象
    	sor.setInputCloud(cloud);//设置进行滤波的点云
    	sor.setMeanK(50);
    	sor.setStddevMulThresh(1.0);
    	sor.filter(*cloud_filtered);//执行滤波处理后的输出结果储存到cloud_filtered中
    	cout << "滤波后: " << endl;
    	cout << *cloud_filtered << endl;
    	
    	//3、将数据存入磁盘,以供他用
    
    	pcl::PCDWriter writer;
    	writer.write("table_scene_lms400_inliers.pcd", *cloud_filtered, false);
    	
    	//4、利用函数setNegative获取离群点数据
    	
    	sor.setNegative(true);
    	sor.filter(*cloud_filtered);
    	writer.write("table_scene_lms400_outliers.pcd", *cloud_filtered, false);
    	
    	system("pause");
    	return 0;
    }
    
    

    5、使用ConditionalRemoval(条件)滤波器移除离群点

    #include <iostream>
    #include <pcl/point_types.h>
    #include <pcl/filters/conditional_removal.h>
    int
    main()
    {
    	//1、创建随机点云
    
    	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 = 5;
    	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);
    	}
    	
    	//2、定义条件滤波器所使用的限制条件
    
    	pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZ>());//实例化条件指针
    	// 添加在Z字段上大于(pcl::ComparisonOps::GT great Then)0的比较算子
    	range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::GT, 0.0)));
    	// 添加在Z字段上小于(pcl::ComparisonOps::LT Lower Then)500的比较算子
    	range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::LT, 500.0)));
    	
    	// 3、条件滤波器的创建和使用
    	
    	pcl::ConditionalRemoval<pcl::PointXYZ> condrem;//创建条件滤波器对象
    	condrem.setCondition(range_cond);//并用条件定义对象初始化
    	condrem.setInputCloud(cloud);//设置输入点云
    	condrem.setKeepOrganized(true);//设置是否保存点云结构,true为保存,即点云个数不变,用nan代替;false为不保存,即点云个数变化
    	condrem.filter(*cloud_filtered);//执行条件滤波器,不在条件范围内的点被替换为nan,保存结果于cloud_filtered中
    	
    	//4、去掉nan点,if步骤3中设置是否保存点云结构为false,则不需要再进行步骤4的操作
    	
    	std::vector<int> mapping;
    	pcl::removeNaNFromPointCloud(*cloud_filtered, *cloud_filtered, mapping);
    
    	std::cerr << "滤波前: " << std::endl;
    	for (size_t i = 0; i < cloud->points.size(); ++i)
    		std::cerr << "    " << cloud->points[i].x << " "<< cloud->points[i].y << " "<< cloud->points[i].z << std::endl;
    	std::cerr << "滤波后: " << std::endl;
    	for (size_t i = 0; i < cloud_filtered->points.size(); ++i)
    		std::cerr << "    " << cloud_filtered->points[i].x << " "<< cloud_filtered->points[i].y << " "<< cloud_filtered->points[i].z << std::endl;
    	
    	system("pause");
    	return (0);
    }
    
    展开全文
  • PCL中常用滤波器的原理与实现

    千次阅读 2018-07-05 21:48:02
    PCL中的filter模块中实现来很多点云滤波算法,以下简单介绍直通滤波器,条件滤波器,统计滤波器和体素栅格滤波器的基本原理,并给出使用对应滤波器的代码片段。...

    PCL的filter模块中实现了很多点云滤波算法,以下简单介绍直通滤波器,条件滤波器,统计滤波器和体素栅格滤波器的基本原理,并给出使用对应滤波器的代码片段。

    直通滤波器

    最简单的一种滤波器,它的作用是过滤掉在指定维度方向上取值不在给定值域内的点。直通滤波器的实现原理如下:首先,指定一个维度以及该维度下的值域,其次,遍历点云中的每个点,判断该点在指定维度上的取值是否在值域内,删除取值不在值域内的点,最后,遍历结束,留下的点即构成滤波后的点云。直通滤波器简单高效,适用于消除背景等操作。

    typedef pcl::PointXYZRGBA PointT;
    typedef pcl::PointCloud<PointT> PointCloudT;
    typedef PointCloudT::Ptr PointCloudTPtr;
    
    pcl::PassThrough<PointT> pass;
    pass.setFilterFieldName("z");
    pass.setFilterLimits(0.7,1.3);
    pass.setInputCloud(preprocess_cloud);
    pass.filter(*preprocess_cloud);

    条件滤波器

    与直通滤波器类似,它的作用是过滤掉点云中不满足给定条件的点,其实现原理也与直通滤波器类似,只是判断方式改变了。相比于直通滤波器,条件滤波器更加灵活,功能也更丰富,其优势主要体现在条件的定义上。我们可以依据点云的不同特征定义多种条件,例如,定义条件为点在x,y和z维度下的取值同时满足某个值域,则可以在指定3D空间内对点云进行裁剪。

    pcl::ConditionalRemoval<PointT> condition;
    //计算点云中的点分别在x,y,z轴向上的最大与最小取值
    pcl::getMinMax3D(*preprocess_cloud,minPT,maxPT);
    //示例,定义“与”条件,定义如下:y轴向从最低点向上0.14米范围与x轴向从中间点分别向两边取0.12米范围
    pcl::ConditionAnd<PointT>::Ptr and_cond(new pcl::ConditionAnd<PointT>());
    and_cond->addComparison(pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT>("y",pcl::ComparisonOps::GT,minPT[1])));
    and_cond->addComparison(pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT>("y",pcl::ComparisonOps::LT,minPT[1]+0.14)));
    and_cond->addComparison(pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT>("x",pcl::ComparisonOps::GT,(minPT[0]+maxPT[0])/2-0.12)));
    and_cond->addComparison(pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT>("x",pcl::ComparisonOps::LT,(minPT[0]+maxPT[0])/2+0.12)));
    //为条件滤波器设置条件
    condition.setCondition(and_cond);
    condition.setInputCloud(preprocess_cloud);
    condition.filter(*preprocess_cloud);

    统计滤波器

    主要作用是去除稀疏离群噪点。在采集点云的过程中,由于测量噪声的影响,会引入部分离群噪点,它们在点云空间中分布稀疏。在估算点云局部特征(例如计算采样点处的法向量和曲率变化率)时,这些噪点可能导致错误的计算结果,从而使点云配准等后期处理失败。统计滤波器的主要思想是假设点云中所有的点与其最近的k个邻居点的平均距离满足高斯分布,那么,根据均值和方差可确定一个距离阈值,当某个点与其最近k个点的平均距离大于这个阈值时,判定该点为离群点并去除。统计滤波器的实现原理如下:首先,遍历点云,计算每个点与其最近的k个邻居点之间的平均距离;其次,计算所有平均距离的均值μ与标准差σ,则距离阈值dmax可表示为dmax=μ+α×σ,α是一个常数,可称为比例系数,它取决于邻居点的数目;最后,再次遍历点云,剔除与k个邻居点的平均距离大于dmax的点。

    pcl::StatisticalOutlierRemoval<PointT> Static;
    Static.setMeanK(100);//邻居点数目k
    Static.setStddevMulThresh(1.5);//比例系数α
    Static.setInputCloud(preprocess_cloud);
    Static.filter(*preprocess_cloud);

    体素栅格滤波器

    主要作用是对点云进行降采样,可以在保证点云原有几何结构基本不变的前提下减少点的数量,多用于密集型点云的预处理中,以加快后续配准、重建等操作的执行速度。体素栅格滤波器的主要思想是在点云所在三维空间创建一个体素栅格,对于栅格内的每一个体素,以体素内所有点的重心近似代替体素中的点,最终,所有体素中的重心点组成滤波后的点云。通过体素的大小可以控制降采样的程度,体素越大,则滤波后的点云越稀疏。体素栅格滤波器的执行速度较慢,但是它能最大限度地保留点云原始的几何信息。

    pcl::VoxelGrid<PointT> voxel;
    voxel.setLeafSize(0.01f, 0.01f, 0.01f);//体素格的大小
    voxel.setInputCloud(preprocess_cloud);
    voxel.filter(*preprocess_cloud);
    展开全文
  • CIC滤波器

    2021-04-12 13:31:50
    CIC滤波器的应用条件3. 多级CIC滤波器的FPGA实现3.1 Hogenauer滤波器3.2 计算字长3.3 FPGA源码 CIC滤波器及半带滤波器因为具有运算速度快,占用资源少的特点,在多速率信号处理中得到广泛的应用。 1. CIC滤波器的...
  • 顾名思义,直通滤波器指通过某一个单一条件进行直接限制,比如过滤出x大于10的点; 代码较简单,直接对关键点进行复述 // Create the filtering object pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new ...
  • 针对传统Unscented卡尔曼滤波器(UKF)在噪声相关条件下非线性滤波失效的问题,研究了一类带相关噪声的非线性离散系统UKF设计方法. 文中基于最小均方误差估计准则,给出了系统噪声和量测噪声相关时UKF滤波递推公式,...
  • 研究非共线性声光可调谐滤波器 (AOTF) 在一般相位匹配条件下的声光相互作用关系。对于通常设计制造的声光可调谐滤波器,它的o光和e光具有不同的波长,应用中无法同时使用此两束衍射光,为了使可用光强增大,应当使两束...
  • 报道了单光子探测条件下的法拉第反常色散滤波器(FADOF)滤波特性的实验结果。测量结果表明,工作在D2共振线的Rb原子780 nm法拉第反常色散滤波器的翼谱透射率为28%,滤光带宽为0.7 GHz,以及最小可探测激光功率为0.16 pW/...
  • 米波波段雷达,譬如超视距雷达,面临空间复杂的电磁环境,低检测概率、低数据率、低观测精度与多...在应用MHT方法的前提下,对不同的滤波器进行仿真,结果表明,用线性补偿滤波器(LCKF)的多假设算法具有较好的性能。
  • 基于卡尔曼滤波器的状态##检验法在应用于动态系统的故障检测时具有较高的灵敏度,但在应用中存在两种潜在的局限性.为此指出并具体研究了这两种局限性;在理论分析的基础上,提出了利用滑动的卡尔曼滤波器输出重置状态...
  • 方案中的自适应滤波器能够在没有任何关于信号和噪声的先验知识的条件下,达到最优滤波的目的。  根据自适应滤波的原理,主要论述和分析了易于实现的最小均方差算法,通过比较IIR结构和FIR结构滤波器的优缺点,采用...
  • 该方法在满足电流跟踪快速性、电流纹波最大允许值等基本条件下,选取了总电感值;并由基波无功损耗约束了电容量上限。在此基础上,考虑到开关次谐波电流衰减率以及谐振频率的制约,综合选取了构成总电感的两部分L1和...
  • 研究了无味粒子滤波器的基本思想和具体算法实现步骤,在给出的闪烁噪声统计模型基础上,将PF、UKF和UPF算法应用在雷达目标跟踪中,解决了闪烁噪声情况下的雷达目标跟踪问题,仿真结果表明,UPF的状态估计性能优越。
  • [Matlab]FIR滤波器设计:(基本窗函数FIR滤波器设计)

    万次阅读 多人点赞 2019-11-16 00:54:00
    但对于FIR滤波器来说,设计方法的关键要求之一就是保证线性相位条件。而IIR滤波器的设计方法中只对幅值特性进行设计,因此无法保证相位。所以FIR滤波器的设计需要采用完全不同的方法。FIR滤波器的设计方法主要有窗...
  • 2 Word 文档 摘 要 FIR数字滤波器是数字信号处理的一个重要组成部分由于FIR数字滤波器具有严格的线性相位因此在信息的采集和处理过程中得到了广泛的应用本文介绍了FIR数字滤波器的概念和线性相位的条件分析了窗函数...
  • 赫金的《自适应滤波器原理》第四版,上一篇看到维纳滤波基本形式:最优化问题,且无任何条件约束。这次看到有约束的部分,简单整理一下思路:  1)拉格朗日乘子法;  2)线性约束最小方差滤波器(Linearly ...
  • 然后使用了一些数学手段来得出高斯的联合概率分布由连部分组成: 条件概率和边缘概率;然后根据这些性质来主动地推出卡尔曼滤波器。 0.1. 卡尔曼滤波器的推导主要分为两步:预测和更新; 卡尔曼滤波器对应到高斯...
  • 滤波器的效率

    2015-04-13 23:58:00
    在前面讨论好滤波器的标准的时候,主要是从滤波器的性能方面来考虑的。实际上,好滤波器的另外一个更高的标准在于满足性能要求的情况下效率要高。...在满足性能要求的条件下,滤波器阶数越低则效率越高...
  • 精品文档 MATLAB IIR数字低通滤波器的设计方法 1IIR 数字低通滤波器 滤波器分两大类经典滤波器和现代滤波器 经典滤波的概念是根据傅里叶分析和变换提出的一个工程概念根据高等数学理论 任何一个满足一定条件的信号 ...
  • Gabor滤波器

    2017-12-07 21:49:03
    1.傅里叶变换 1) 简介 数字图像处理的方法主要分成两大部分:空域分析法和频域分析法。空域分析法就是对图像矩阵进行处理;频域分析法是通过图像变换...① f(t)在任一有限区间上满足狄氏条件; ② f(t)在上绝对可积
  • 光子晶体滤波器设计

    2019-01-09 09:29:51
    然后根据该条件设计了四信道滤波器,并利用时域有限差分法进行了仿真. 仿真结果显示,四信道耦合效率均超过96 % ,当晶格常量取570 nm 时,四信道的中心频率在1 520 nm 到1 580 nm 之间,信道间隔均小于20 nm ,信道间窜扰...
  • 实验研究了熔锥条件对双锥光纤滤波器的影响。提出一个高斯模型,预测锥的几何形状。获得了窄带(3 dB带宽4 nm)带通双锥光纤滤波器以及带阻中心波长分别为1535 nm(损耗-6.6 dB)和1559 nm(损耗-19.6 dB)的带阻双锥光纤...
  • 精品文档 精品文档 PAGE PAGE #欢迎下载 MATLAB IIR数字低通滤波器的设计方法 1 IIR数字低通滤波器 滤波器分两大类经典滤波器和现代滤波器 经典滤波的概念是根据傅里叶分析和变换提出的一个工程概念根据高等数学理论...
  • 对于FIR数字滤波器,可设其系统函数为 (1)H(z)=∑n=0N−1anz−n H(z)=\sum_{n=0}^{N-1} a_n z^{-n} \quad \tag{1} H(z)=n=0∑N−1​an​z−n(1) 从(1)式中,可以看出,H(z)H(z)H(z)的极点全部都在z=0z=0z=0处。 考虑...
  • 电源滤波器的目的是抑制电磁噪声,功能就是通过在电源线中接入电源滤波器,得到一个特定频率的电源信号,或消除一个特定频率后的电源信号。在使用的时候我们就需要... 额定电流(Ir)是在额定电压和指定环境温度条件
  • 数字滤波器设计

    2021-04-16 10:20:45
    拉普拉斯变换就是将傅里叶变换中不满足绝对可和的信号人为加一个衰减边界,使其满足傅里叶变换条件,并没有改变信号本身的频域信息, 傅:e^(jwt) --> coswt+jsinwt 拉:e^(at+jwt) = e ^(st) --> e ^(at) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,349
精华内容 539
关键字:

条件滤波器