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
    +关注

    关注

    5006

    文章

    13101

    浏览量

    461392
  • 滤波
    +关注

    关注

    10

    文章

    662

    浏览量

    56567
  • 点云
    +关注

    关注

    0

    文章

    58

    浏览量

    3774
收藏 人收藏

    评论

    相关推荐

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

    常用的经典滤波算法有哪些??
    发表于 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-06 14:06 19次下载

    SAR图像自动性能分析

    合成孔径雷达(SAR)图像的自动长期以来都未能很好的解决,特别是高分辨率SAR图像其的关键是稳健的特征提取与特征匹配算法。在光学图像
    发表于 04-28 15:04 26次下载

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

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

    基于SIFT特征的图像(图像匹配)

     SIFT图像处理代码,必须和三个文件一起下载使用:基于SIFT特征的图像(Matlab源代码)、基于SIFT特征的图像(仿真图片)。
    发表于 08-06 08:00 3次下载

    基于SIFT特征的图像(仿真图片)

    SIFT图像处理代码,必须和三个文件一起下载使用:基于SIFT特征的图像(Matlab源代码)、基于SIFT特征的图像(图像匹配)。
    发表于 08-06 08:00 3次下载

    使用PCL进行点云数据粗算法的研究资料分析

    传统ICP算法精度受点云初始位姿影响较大,收敛速度慢,不能满足精细化点云建模的要求。基于此问题,通过基于快速点特征直方图的采样一致性方法进行粗。首先将两帧待
    发表于 03-01 09:34 14次下载
    使用<b class='flag-5'>PCL</b>进行点云数据粗<b class='flag-5'>配</b><b class='flag-5'>准</b>算法的研究资料分析

    常用的数字滤波方法

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

    电感滤波常用的三种方式

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

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

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

    常用的ADC滤波算法有哪些

    ADC(模数转换器)滤波算法在信号处理中起着至关重要的作用,它们能够帮助我们提取出有用的信号,同时滤除噪声和干扰。以下是常用的ADC滤波算法详解,这些算法各具特色,适用于不同的应用场景。
    的头像 发表于 10-08 14:35 222次阅读