前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >久违的小分享(2)

久违的小分享(2)

作者头像
点云PCL博主
发布2019-07-31 14:27:36
5050
发布2019-07-31 14:27:36
举报
文章被收录于专栏:点云PCL点云PCL

PCL中基于统计的点云去噪

PCL中进行点云去噪的方法比较多,其中一种基于统计学的方法比较新颖,其函数为StatisticalOutlierRemoval。其原理是将输入数据中每个点到临近点的距离分布情况进行计算,得到各点到它所有临近点的平均距离。假设得到的结果是一个高斯分布,其形状由均值和标准差决定,平均距离在标准范围之外,就被定义为离群点而将其从数据集中删除。 其实现的关键代码进行说明:

代码语言:javascript
复制
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; // 创建滤波器对象
sor.setInputCloud(cloud); // 设置需要进行去噪的点云对象
sor.setMeanK(m); // 设置 m 为在进行统计时考虑查询点邻近点数
sor.setStddevMulThresh(1.0); // 设置距离阈值,
 其公式是 mean + global stddev_mult * global stddev
sor.filter(*cloud_filtered); // 执行去噪计算并保存到 cloud_filtered

最后附上完整代码,以及不同参数设置时,滤波效果截图

代码语言:javascript
复制
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/visualization/pcl_visualizer.h>

void main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptrcloud
                          (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptrcloud_filtered
                          (new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("E:\\table_scene_lms400.pcd",*cloud);
pcl::visualization::PCLVisualizerviewer1("Cloud before filtering");
viewer1.setBackgroundColor(0,0, 0);//黑色背景
pcl::visualization::PointCloudColorHandlerCustom
                          <pcl::PointXYZ>before_color(cloud, 0, 255, 0);
viewer1.addPointCloud<pcl::PointXYZ>(cloud,before_color, "before filter");
pcl::StatisticalOutlierRemoval<pcl::PointXYZ>sor;
sor.setInputCloud(cloud);
sor.setMeanK(50);//近邻点个数50
sor.setStddevMulThresh(1);
sor.filter(*cloud_filtered);
pcl::visualization::PCLVisualizerviewer2("After before filtering");
viewer2.setBackgroundColor(0,0, 0);//黑色背景

pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>
                          after_color(cloud_filtered, 255, 0, 0);
viewer2.addPointCloud<pcl::PointXYZ>
                          (cloud_filtered,after_color, "after filter");
     
while (!viewer1.wasStopped()|| !viewer2.wasStopped())
      {
             viewer1.spinOnce(1);
             viewer2.spinOnce(1);
      }
}

其中绿色点云是未进行滤波,红色点云是不同参数滤波后的图。

sor.setStddevMulThresh(0.5); 参数设置过小,导致边界点部分被剔除

sor.setStddevMulThresh(1);参数设置恰当,提取效果理想

欢迎投稿分享,联系邮箱或者QQ:920177957@qq.com

亦可以加入QQ群一起交流学习。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 点云PCL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档