0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PCL滤波配准常用的滤波方式

麦辣鸡腿堡 来源:古月居 作者:lovely_yoshino 2023-11-28 11:24 次阅读

最近在看PCL滤波配准等操作,之前在自动驾驶-激光雷达预处理/特征提取和提到了一些滤除点云等操作,但是最近作者发现里面还有一些配准的方法还没有提到,所以这里重新开个章节来给大家列举一些常用的滤波方式,方便大家查阅和使用

滤波&聚类

1.1 直通滤波器

void pass_through_filter(const pcl::PointCloud< pcl::PointXYZRGB >::Ptr &input_cloud) //直通滤波器    {        std::cout < < "start pass_through_filter" < < std::endl;        calc_sight_center(); //计算视点中心,视点中心为滤波器的输入参数        // 
void ex_segmentor::calc_sight_center()        // {        // double roll, pitch, yaw;        // 
tf::Quaternion quat_tmp;        // tf::quaternionMsgToTF(latest_camera_pos_.pose.pose.orientation, quat_tmp);        // tf::Matrix3x3(quat_tmp).getRPY(roll, pitch, yaw);        // centerX_ = latest_camera_pos_.pose.pose.position.x + gaze_length_ * cos(yaw);        //
 centerY_ = latest_camera_pos_.pose.pose.position.y + gaze_length_ * sin(yaw);        // 
centerZ_ = latest_camera_pos_.pose.pose.position.z - gaze_length_ * sin(pitch);        // }        // 
build the condition        pcl::ConditionAnd< pcl::PointXYZRGB >::Ptr range_limit(new pcl::ConditionAnd< pcl::PointXYZRGB >);                                                                         //构建范围限制条件        
range_limit- >addComparison(pcl::FieldComparison< pcl::PointXYZRGB >::ConstPtr(new pcl::FieldComparison< pcl::PointXYZRGB >("x", pcl::ComparisonOps::GT, centerX_ - 1.5))); // x坐标大于视点中心x坐标-1.5        range_limit- >addComparison(pcl::FieldComparison< pcl::PointXYZRGB >::ConstPtr(new pcl::FieldComparison< pcl::PointXYZRGB >("x", pcl::ComparisonOps::LT, centerX_ + 1.5))); // x坐标小于视点中心x坐标+1.5       
 range_limit- >addComparison(pcl::FieldComparison< pcl::PointXYZRGB >::ConstPtr(new pcl::FieldComparison< pcl::PointXYZRGB >("y", pcl::ComparisonOps::GT, centerY_ - 1.5))); // y坐标大于视点中心y坐标-1.5        
range_limit- >addComparison(pcl::FieldComparison< pcl::PointXYZRGB >::ConstPtr(new pcl::FieldComparison< pcl::PointXYZRGB >("y", pcl::ComparisonOps::LT, centerY_ + 1.5))); // y坐标小于视点中心y坐标+1.5        
range_limit- >addComparison(pcl::FieldComparison< pcl::PointXYZRGB >::ConstPtr(new pcl::FieldComparison< pcl::PointXYZRGB >("z", pcl::ComparisonOps::GT, centerZ_ - 1.5))); // z坐标大于视点中心z坐标-1.5        
range_limit- >addComparison(pcl::FieldComparison< pcl::PointXYZRGB >::ConstPtr(new pcl::FieldComparison< pcl::PointXYZRGB >("z", pcl::ComparisonOps::LT, centerZ_ + 1.5))); // z坐标小于视点中心z坐标+1.5        //构建滤波器 
       pcl::ConditionalRemoval< pcl::PointXYZRGB > condrem; //构建滤波器
        condrem.setCondition(range_limit);                 //设置滤波条件
        condrem.setInputCloud(input_cloud);                //设置输入点云        //滤波操作       
 condrem.filter(*input_cloud);    }

1.2 离群点滤波器

void statical_outlier_filter(const pcl::PointCloud&lt;PointXYZRGB&gt;::Ptr &input_cloud, int nr_k, double stddev_mult) //滤波器移除离群点    {        pcl::StatisticalOutlierRemoval&lt;PointXYZRGB&gt; sorfilter(true); //构建滤波器        sorfilter.setInputCloud(input_cloud);        sorfilter.setMeanK(nr_k);                  //设置在进行统计时考虑的临近点个数        sorfilter.setStddevMulThresh(stddev_mult); //设置判断是否为离群点的阀值,用来倍乘标准差,也就是上面的stddev_mult        sorfilter.filter(*input_cloud);            //滤波结果存储到cloud_filtered    }

1.3 体素化滤波器

void voxel_filter(const pcl::PointCloud< PointXYZRGB >::Ptr &input_cloud, float resolution) //体素化滤波器  
  {        pcl::VoxelGrid< PointXYZRGB > voxel_grid; //构建体素化滤波器
        voxel_grid.setInputCloud(input_cloud);   //设置输入点云        
voxel_grid.setLeafSize(resolution, resolution, resolution); //设置体素的大小        voxel_grid.filter(*input_cloud); //滤波结果存储到cloud_filtered    }

1.4 平面点滤除

bool remove_plane(const pcl::PointCloud< PointXYZRGB >::Ptr &input_cloud, const Eigen::Vector3f &axis, double plane_thickness) //移除平面    {        pcl::ModelCoefficients::Ptr 
coefficients(new pcl::ModelCoefficients); //平面参数矩阵        
pcl::PointIndices::Ptr inliers(new pcl::PointIndices);                //平面内点索引        // Create the 
segmentation object        pcl::SACSegmentation< pcl::PointXYZRGB > seg; //构建分割对象        
seg.setOptimizeCoefficients(true);                   //设置是否优化系数        
seg.setModelType(pcl::SACMODEL_PERPENDICULAR_PLANE); //设置模型类型为平面       
 seg.setMethodType(pcl::SAC_RANSAC);                  //设置分割方法为RANSAC        

seg.setMaxIterations(500);                           //设置最大迭代次数        seg.setAxis(axis);                                   //设置分割轴        seg.setEpsAngle(0.25);                               //设置角度阈值       
 seg.setDistanceThreshold(plane_thickness);           //设置距离阈值  0.025 0.018       
 seg.setInputCloud(input_cloud);                      //设置输入点云        seg.segment(*inliers, 
*coefficients);                //分割平面        if (inliers- >indices.size() < 500)        {            // 
ROS_INFO("plane size is not enough large to remove.");            return false;        }       
 pcl::ExtractIndices< pcl::PointXYZRGB > extract;        extract.setInputCloud(input_cloud); //设置输入点云        extract.setIndices(inliers);        //设置索引,用来滤除        extract.setNegative(true);          //设置是否滤除索引内的点        extract.filter(*input_cloud);        return true;    }

1.5 RGBD颜色特征聚类

void clustoring_with_color(pcl::PointCloud&lt;pcl::PointXYZRGB&gt;::Ptr &input_cloud, std::vector&lt;pcl::PointCloud&lt;PointXYZRGB&gt;::Ptr&gt; &clusters, int min_cluster_size, float distance_th, float color_th, float region_color_th, unsigned int num_nbr) //根据点云的颜色完成聚类    {        std::vector&lt;pcl::PointIndices&gt; clusters_indices;                                              //聚类索引        pcl::search::KdTree&lt;pcl::PointXYZRGB&gt;::Ptr kdtree(new pcl::search::KdTree&lt;pcl::PointXYZRGB&gt;); //构建kd树        kdtree-&gt;setInputCloud(input_cloud);                                                           //设置输入点云        // 基于颜色的区域生长聚类对象        

pcl::RegionGrowingRGB&lt;pcl::PointXYZRGB&gt; clustering;        clustering.setInputCloud(input_cloud);        clustering.setSearchMethod(kdtree); //设置搜索方法        // 这里,最小簇大小也会影响后处理步骤: 小于这个值的clusters_indices将与邻点合并。       
clustering.setMinClusterSize(min_cluster_size); //设置最小簇大小        // 设置距离阈值,以知道哪些点将被视为,邻点        clustering.setDistanceThreshold(distance_th); // 1        // 颜色阈值,用于比较两个点的RGB颜色        clustering.setPointColorThreshold(color_th); // 9 6.5 25.0f 18.0f        // 后处理步骤的区域颜色阈值:颜色在阈值内的clusters_indices将合并为一个。       
clustering.setRegionColorThreshold(region_color_th); // 2        //区域耦合时检查的附近的数量。默认为100, 在不影响结果的范围内适度设定小范围。       
clustering.setNumberOfRegionNeighbours(num_nbr); //设置近邻数量        // 
clustering.setSmoothModeFlag(true);        // clustering.setSmoothnessThreshold(0.95);        
clustering.extract(clusters_indices); //提取聚类索引        for (std::vector&lt;pcl::PointIndices&gt;::const_iterator i = clusters_indices.begin(); i != 
clusters_indices.end(); ++i)//遍历聚类索引        {            
pcl::PointCloud&lt;pcl::PointXYZRGB&gt;::Ptr cluster(new 
pcl::PointCloud&lt;pcl::PointXYZRGB&gt;); //构建聚类点云            for 
(std::vector&lt;int&gt;::const_iterator pit = i-&gt;indices.begin(); pit != i-&gt;indices.end(); ++pit) //遍历聚类索引中的点索引            {                cluster-&gt;points.push_back(input_cloud-&gt;points[*pit]); //将点添加到聚类点云            }            cluster-&gt;width = cluster-&gt;points.size();            cluster-&gt;height = 1;            cluster-&gt;is_dense = true;            clusters.push_back(cluster); //将聚类点云添加到聚类点云集合中        }    }
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • plc
    plc
    +关注

    关注

    4975

    文章

    12261

    浏览量

    454966
  • 滤波
    +关注

    关注

    10

    文章

    624

    浏览量

    56250
  • 点云
    +关注

    关注

    0

    文章

    58

    浏览量

    3725
收藏 人收藏

    评论

    相关推荐

    常用的经典滤波算法有哪些??

    常用的经典滤波算法有哪些??
    发表于 07-01 15:15

    跪求常用滤波方法

    常用滤波方法
    发表于 12-17 22:50

    matlab 图像问题,有代码,区域是绿色的,想要的是灰度图像的区域,求助大神?

    ','joint');title('完成');set(gca,'units','pixels','Visible','off');frame=getframe;im1=frame2im(frame
    发表于 03-21 16:49

    AD转换常用滤波算法

    AD转换常用滤波算法
    发表于 08-01 10:46

    电路滤波方式提问

    有人知道这个电路图中的四个电容作用分别是什么吗?它的低通滤波为什么没有电阻,还是只用了电容滤波滤波方式是什么?
    发表于 08-31 17:44

    硬件系统中常用滤波电路

    硬件设计之一——电源设计04:滤波电路本节讲一下硬件系统中常用滤波电路,主要包括芯片的滤波电路,一些模拟芯片的滤波电路,模拟电路的
    发表于 07-23 07:41

    分享几种较简单而常用滤波算法

    在单片机开发中,经常需要对输入的数据进行过滤处理,如传感器数据输出,AD采样等,合适的滤波处理能达到更好效果。下面分享几种较简单而常用滤波算法:文章目录@[toc]一、限幅滤波法(又
    发表于 12-21 06:10

    滤波器的原理种类以及计算方式

    滤波器的滤波电路、原理种类以及计算方式
    的头像 发表于 03-12 17:16 8.4w次阅读
    <b class='flag-5'>滤波</b>器的原理种类以及计算<b class='flag-5'>方式</b>

    详细介绍无源滤波电路常用的五种电路形式

    滤波是信号处理里面比较重要的一个环节,通常减少直流当中的交流成分并获得比较平滑的直流电,在整流之后都要经过滤波电路,滤波常用的元器件是电容、电阻以及电感,这三个均属于无源器件,下面介绍
    的头像 发表于 08-08 16:08 1.4w次阅读
    详细介绍无源<b class='flag-5'>滤波</b>电路<b class='flag-5'>常用</b>的五种电路形式

    常用的数字滤波方法

    平均值滤波就是对多个采样值进行平均算法,这是消除随机误差最常用的方法。
    的头像 发表于 08-24 11:28 3.8w次阅读

    电感滤波常用的三种方式

    电感滤波常用方式如下:1、L型滤波其原理就是输入端串入一个电感,电感滤除高频信号效果最明显,主要是利用电感中的电流不能突变的原理,当电感中的电流增大时,将其存储于电感当中使电流缓慢增
    的头像 发表于 12-22 09:09 3w次阅读

    TST嘉硕滤波常用型号列表

    TST嘉硕滤波常用型号列表
    发表于 10-27 15:48 22次下载

    常用滤波电路的特点

    为了减小整流后电压的脉动,常采用滤波电路把交流分量过滤出去,使负载两端得到脉动较小的直流电。常用滤波电路有电容滤波电路、电感滤波电路、复式
    的头像 发表于 02-20 14:59 2283次阅读
    <b class='flag-5'>常用</b>的<b class='flag-5'>滤波</b>电路的特点

    PCL中基础下采样介绍

    ::PointCloud ); //随机下采样点云 pcl::RandomSample rs; //创建滤波器对象 rs.setInputCloud(cloud); //设置待滤波点云
    的头像 发表于 11-21 17:03 455次阅读
    <b class='flag-5'>PCL</b>中基础下采样介绍

    滤波电容不同补偿方式优缺点对比

    滤波电容不同补偿方式优缺点对比  滤波电容是电子电路中常用的元件,用于对信号进行滤波处理。不同的补偿方式
    的头像 发表于 01-04 16:00 309次阅读