官方代码解析

首先解析一波官方代码:

pcl::PCDReaderreader;//定义读取对象
reader.read<pcl::PointXYZ>("table_scene_lms400.pcd",*cloud);//读取点云文件

然后,创建了一个pcl::StatisticalOutlierRemoval滤波器,将对每个点分析的临近点个数设为50,并将标准差倍数设为1,这意味着如果一个点的距离超出平均距离一个标准差以上,则该点被标记为离群点,并将被移除。计算后的输出结果储存在cloud_filtered中。

pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;// 创建滤波器对象
sor.setInputCloud(cloud);                        //设置呆滤波的点云
sor.setMeanK(50);                                //设置在进行统计时考虑查询点邻近点数
sor.setStddevMulThresh(1.0);                    //设置判断是否为离群点的阈值
sor.filter(*cloud_filtered);                    //执行滤波处理保存内点到cloud_filtered

剩下的数据(内部点)将被存入磁盘,以供其他使用,例如可视化等。

pcl::PCDWriterwriter;
writer.write<pcl::PointXYZ>("table_scene_lms400_inliers.pcd",*cloud_filtered,false);

然后,使用同样的参数再次调用该滤波器,但是利用函数setNegative设置使输出取外点,以获取离群点数据(也就是原本滤除掉的点)。

sor.setNegative(true);
sor.filter(*cloud_filtered);

并将数据写回到磁盘。

writer.write<pcl::PointXYZ>("table_scene_lms400_outliers.pcd",*cloud_filtered,false);

实战数据:

#include <iostream>
#include <vector>
#include <ctime>
//---------------------------------------------
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/vtk_lib_io.h> //obj读取头文件
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/normal_3d.h>
//-法向显示错误:no override found for vtkActor--
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
//outlier
#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 bottom(new pcl::PointCloud<pcl::PointXYZ>);//-------------------------------读取点云文件---------------------------------------------------pcl::PolygonMesh mesh;if (pcl::io::loadPolygonFile("D:/pcd/shoeData/0422/0423-1.obj", mesh) == -1){cout << "COULD NOT READ FILE mid.pcl \n";system("pause");return (-1);}pcl::fromPCLPointCloud2(mesh.cloud, *cloud);cout << "points sieze is:" << cloud->size() << endl;//outlierpcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;sor.setInputCloud(cloud);sor.setMeanK(200);   //设置在进行统计时考虑查询点邻近点数sor.setStddevMulThresh(1.0);   //设置判断是否为离群点的阈值,如果一个点的距离超出平均距离一个标准差以上,则该点被标记为离群点,并将被移除。sor.filter(*cloud_filtered);//---------------------------------显示---------------------------------------------------------------------boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D viewer"));int v1(0);viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);//xmin, ymin, xmax, ymax,取值范围0-1viewer->setBackgroundColor(0, 0, 0, v1);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> green0(cloud, 0, 225, 0);viewer->addPointCloud(cloud, green0, "cloud", v1);int v2(0);viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);viewer->setBackgroundColor(0.3, 0.3, 0.3, v2);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> green1(cloud_filtered, 0, 225, 0);viewer->addPointCloud(cloud_filtered, green1, "cloud_filtered", v2);while (!viewer->wasStopped()) {viewer->spinOnce(100);}system("pause");return 0;
}

效果图

StatisticalOutlierRemoval:离群点移除相关推荐

  1. 从Hadoop集群中移除一块磁盘的操作

    2019独角兽企业重金招聘Python工程师标准>>> 背景 由于历史原因,CDH的hadoop的每个DataNode节点下挂载了多个磁盘,后要对一些配置差的磁盘要用配置较好的新磁盘 ...

  2. 使用 kubectl drain 从集群中移除节点

    对节点执行维护操作之前(例如:内核升级,硬件维护等),您可以使用 kubectl drain 安全驱逐节点上面所有的 pod.安全驱逐的方式将会允许 pod 里面的容器遵循指定的 PodDisrupt ...

  3. 记hadoop集群黑名单移除节点出现问题及解决

    首先区分一下通过直接下线服务和通过黑名单来移除节点的区别,这两个动作都会涉及到block副本数不够而复制移动恢复的问题,但是通过黑名单的话可以同时移除多个节点,这个是两种情况的主要区别: 步骤: 1. ...

  4. mysql 集群怎么卸载节点_Greenplum移除节点

    基于某某原因,我们的Greenplum需要卸载一个节点(测试环境的Greenplum集群),由于该集群使用了很久,里面有许多开发所需要的数据,所以在卸掉一个节点后,还要保证数据不会丢失. 当然,期间也 ...

  5. PCL学习记录-3 Filter-3 StatisticalOutlierRemoval filter(离散点去除)功能及用法解析

    稀疏离群值的消除基于输入数据集中点到邻居距离的分布的计算.对于每个点,我们计算从它到所有相邻点的平均距离.通过假设结果分布是具有均值和标准差的高斯分布,可以将其平均距离在由全局距离均值和标准差定义的区 ...

  6. docker 实现redis集群搭建

    摘要:接触docker以来,似乎养成了一种习惯,安装什么应用软件都想往docker方向做,今天就想来尝试下使用docker搭建redis集群. 首先,我们需要理论知识:Redis Cluster是Re ...

  7. redis集群之REDIS CLUSTER

    redis集群之REDIS CLUSTER 时间 2016-04-11 17:05:00  NoSQL_博客园 原文  http://www.cnblogs.com/zhanchenjin/p/537 ...

  8. ElasticSearch之集群原理

    ElasticSearch 的主旨是随时可用和按需扩容. 而扩容可以通过购买性能更强大(垂直扩容,或 纵向扩容) 或者数量更多的服务器(水平扩容,或 横向扩容 )来实现. 虽然 ElasticSear ...

  9. redis集群扩容和缩容_redis集群cluster搭建,扩容缩容

    1.    概要说明 1.1.    概述 本文旨在说明平台部署环境搭建的过程和详细步骤说明,为后面系统部署提供清晰的参考依照. 以下搭建部署的环境,为一个小型的分布式集群环境.满足负载均衡和单点故障 ...

最新文章

  1. 制药行业智能化发展现状趋势及建议
  2. 阿里云低代码行业智能开放平台开拓行业AI应用新方法
  3. 叉叉框架_叉/连接框架
  4. cbitmap 从内存中加载jpg_Pytorch数据加载的分析
  5. mybatis官方文档知识点梳理
  6. 个人笔记1:display与visibility用法
  7. c语言中row是什么意思中文,row是什么意思
  8. Linux内核——任务管理
  9. win10隐藏正在运行的程序怎么操作_win10怎么隐藏正在运行的软件
  10. 一种利用强核力和弱核力复制物质原子的仪器
  11. Flex入门基础——项目item的属性(order、flex-grow、flex-shrink、flex-basis、flex、align-self)
  12. Linux下so文件的生成和使用
  13. 项目部署的常用进程管理命令
  14. 熔断器Hystrix配置及使用
  15. python 贪吃蛇大作战_Python 实现 贪吃蛇大作战 代码分享
  16. SkyWalking 详细安装
  17. 玳鸽信息:近一年多数产业端对于转型升级有了明确的需求 | FBEC 2020特别策划...
  18. 美图秀秀2015年实习生android应用开发方向招聘笔试题
  19. 联想企业网盘:SaaS服务集群化持续交付实践
  20. Delphi ActionList详解

热门文章

  1. Codeforces Round #552 (Div. 3)D、E题解
  2. 《CSS蝉意花园读书精记》(基础篇---------上.资料篇1)
  3. Touch UI:高质量的移动端UI框架介绍
  4. 期初付年金(annuity-due)
  5. JavaCodeTra 猴子选猴王 约瑟夫循环
  6. .net中下载文件的方法
  7. 数据对象类代码的生成小工具
  8. Liverpool一日游
  9. Unity 中使用Async-Await替代 coroutines
  10. Adreno GPU Profiler