博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PCL滤波介绍(2)
阅读量:6241 次
发布时间:2019-06-22

本文共 3475 字,大约阅读时间需要 11 分钟。

(1)使用statisticalOutlierRemoval滤波器移除离群点

  使用统计分析技术,从一个点云数据中集中移除测量噪声点(也就是离群点)比如:激光扫描通常会产生密度不均匀的点云数据集,另外测量中的误差也会产生稀疏的离群点,使效果不好,估计局部点云特征(例如采样点处法向量或曲率变化率)的运算复杂,这会导致错误的数值,反过来就会导致点云配准等后期的处理失败。

解决办法:每个点的邻域进行一个统计分析,并修剪掉一些不符合一定标准的点,稀疏离群点移除方法基于在输入数据中对点到临近点的距离分布的计算,对每一个点,计算它到它的所有临近点的平均距离,,假设得到的结果是一个高斯分布,其形状是由均值和标准差决定,平均距离在标准范围之外的点,可以被定义为离群点并可从数据中去除。

 建立文件statistical_removal.cpp

#include 
#include
#include
#include
intmain (int argc, char** argv){ pcl::PointCloud
::Ptr cloud (new pcl::PointCloud
); pcl::PointCloud
::Ptr cloud_filtered (new pcl::PointCloud
); // 定义读取对象 pcl::PCDReader reader; // 读取点云文件 reader.read
("table_scene_lms400.pcd", *cloud); std::cerr << "Cloud before filtering: " << std::endl; std::cerr << *cloud << std::endl; // 创建滤波器,对每个点分析的临近点的个数设置为50 ,并将标准差的倍数设置为1 这意味着如果一 //个点的距离超出了平均距离一个标准差以上,则该点被标记为离群点,并将它移除,存储起来 pcl::StatisticalOutlierRemoval
sor; //创建滤波器对象 sor.setInputCloud (cloud); //设置待滤波的点云 sor.setMeanK (50); //设置在进行统计时考虑查询点临近点数 sor.setStddevMulThresh (1.0); //设置判断是否为离群点的阀值 sor.filter (*cloud_filtered); //存储 std::cerr << "Cloud after filtering: " << std::endl; std::cerr << *cloud_filtered << std::endl; pcl::PCDWriter writer; writer.write
("table_scene_lms400_inliers.pcd", *cloud_filtered, false); sor.setNegative (true); sor.filter (*cloud_filtered); writer.write
("table_scene_lms400_outliers.pcd", *cloud_filtered, false); return (0);}

运行结果为:

( 2)使用参数化模型投影点云

   如何将点投影到一个参数化模型上(平面或者球体等),参数化模型通过一组参数来设定,对于平面来说使用其等式形式.在PCL中有特意存储常见模型系数的数据结构

#include 
#include
#include
#include
//模型系数头文件#include
//投影滤波类头文件int main (int argc, char** argv){ pcl::PointCloud
::Ptr cloud (new pcl::PointCloud
); pcl::PointCloud
::Ptr cloud_projected (new pcl::PointCloud
); //创建点云并打印出来 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); } std::cerr << "Cloud before projection: " << 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; // 填充ModelCoefficients的值,使用ax+by+cz+d=0平面模型,其中 a=b=d=0,c=1 也就是X——Y平面 //定义模型系数对象,并填充对应的数据 pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ()); coefficients->values.resize (4); coefficients->values[0] = coefficients->values[1] = 0; coefficients->values[2] = 1.0; coefficients->values[3] = 0; // 创建ProjectInliers对象,使用ModelCoefficients作为投影对象的模型参数 pcl::ProjectInliers
proj; //创建投影滤波对象 proj.setModelType (pcl::SACMODEL_PLANE); //设置对象对应的投影模型 proj.setInputCloud (cloud); //设置输入点云 proj.setModelCoefficients (coefficients); //设置模型对应的系数 proj.filter (*cloud_projected); //投影结果存储 std::cerr << "Cloud after projection: " << std::endl; for (size_t i = 0; i < cloud_projected->points.size (); ++i) std::cerr << " " << cloud_projected->points[i].x << " " << cloud_projected->points[i].y << " " << cloud_projected->points[i].z << std::endl; return (0);}

编译运行的结果如下

实验结果可以看出投影前的Z轴都不为0 ,都是随机产生的值,投影之后,打印的结果表明,xy的值都没有改变,z都变为0

所以该投影滤波类就是输入点云和投影模型,输出为投影到模型上之后的点云。

 

 

 

未完待续**************************88888

转载地址:http://qdcia.baihongyu.com/

你可能感兴趣的文章
Tensorboard教程:显示计算图中节点信息
查看>>
java 线程基本概念 可见性 同步
查看>>
Java:JUnit包
查看>>
unity_快捷键
查看>>
洛谷P3358 最长k可重区间集问题(费用流)
查看>>
洛谷P1251 餐巾计划问题(费用流)
查看>>
Beta冲刺(2/5)(麻瓜制造者)
查看>>
vs2012编码的UI测试使用教程
查看>>
android 在非UI线程更新UI仍然成功原因深入剖析
查看>>
清北NOIP训练营集训笔记——图论
查看>>
oracle ORA-00060死锁查询、表空间扩容
查看>>
转载自https://github.com/jsfront/src/blob/master/css.md
查看>>
MySQL索引优化分析(上)
查看>>
jquery $().each,$.each的区别
查看>>
sql server 2000/2005 游标的使用操作(转)
查看>>
Tomcat 部署 Web 通过 ip 直接访问项目
查看>>
Cache Fusion
查看>>
bzoj2502
查看>>
Xcode 控制台打印Unicode字符串转换为中文
查看>>
Codeforces 831C--Jury Marks (思维)
查看>>