pcl之滤波器(二)

在这里插入图片描述

pcl滤波器

pcl一共是有十二个主要模块,详细了解可以查看官网。https://pcl.readthedocs.io/projects/tutorials/en/latest/#basic-usage

今天学习一下pcl的滤波器模块。

滤波器模块,官网一共是提供了6个例程,今天看第三个、第四个。

滤波器移出离群点

激光扫描通常会产生不同点密度的点云数据集。此外,测量误差会导致稀疏的异常值,从而影响结果。这使得局部点云特征(如表面法线或曲率变化)的估计变得复杂,导致错误的值,进而可能导致点云配准失败。其中一些不规则现象可以通过对每个点的邻域进行统计分析来解决,并去除那些不符合特定标准的点。

测试的pcd文件地址
https://raw.github.com/PointCloudLibrary/data/master/tutorials/table_scene_lms400.pcd

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>     //声明点类型
#include <pcl/filters/statistical_outlier_removal.h>int
main (int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);// 定义读取对象pcl::PCDReader reader;// 读取点云文件reader.read<pcl::PointXYZ> ("../table_scene_lms400.pcd", *cloud);std::cerr << "Cloud before filtering: " << std::endl;std::cerr << *cloud << std::endl;// 创建滤波器,对每个点分析的临近点的个数设置为50 ,并将标准差的倍数设置为1  这意味着如果一//个点的距离超出了平均距离一个标准差以上,则该点被标记为离群点,并将它移除,存储起来pcl::StatisticalOutlierRemoval<pcl::PointXYZ> 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<pcl::PointXYZ> ("../table_scene_lms400_inliers.pcd", *cloud_filtered, false);
//true:滤波结果取反,被过滤的点sor.setNegative (true);sor.filter (*cloud_filtered);writer.write<pcl::PointXYZ> ("../table_scene_lms400_outliers.pcd", *cloud_filtered, false);return (0);
}

代码都有注释,看一下结果吧。

原图
在这里插入图片描述

inliers:

在这里插入图片描述

outliers:

在这里插入图片描述

感觉效果还是比较理想的。

CMakeLists.txt:

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(statistical_removal)find_package(PCL 1.2 REQUIRED)include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})add_executable (statistical_removal statistical_removal.cpp)
target_link_libraries (statistical_removal ${PCL_LIBRARIES})

使用参数化模型投影点

这部分主要是学习如何将点投影到参数化模型上(例如,平面,球体等)。参数模型是通过一组系数给出的——在平面的情况下,通过它的方程:ax + by + cz + d = 0。

看一下代码:

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>                    //声明点类型
#include <pcl/ModelCoefficients.h>             //模型系数头文件
#include <pcl/filters/project_inliers.h>          //投影滤波类头文件int
main(int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_projected(new pcl::PointCloud<pcl::PointXYZ>);//创建点云并打印出来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<pcl::PointXYZ> proj;     //创建投影滤波对象proj.setModelType(pcl::SACMODEL_PLANE);      //设置对象对应的投影模型proj.setInputCloud(cloud);                   //设置输入点云proj.setModelCoefficients(coefficients);       //设置模型对应的系数proj.filter(*cloud_projected);                 //投影结果存储cloud_projectedstd::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;system("pause");return (0);
}

运行结果如下:
在这里插入图片描述

程序的功能也主要就是将三维的点投影到二维xy平面上。

CMakeLists.txt

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(project_inliers)find_package(PCL 1.2 REQUIRED)include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})add_executable (project_inliers project_inliers.cpp)
target_link_libraries (project_inliers ${PCL_LIBRARIES})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/427776.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Foxmail】客户端发送邮件错误:SSL Recv :服务器断开连接, errorCode: 6

Foxmail客户端发送邮件提示&#xff1a;SSL Recv :服务器断开连接, errorCode: 6 错误代码 处理方式&#xff1a; 去邮箱生成新的16位授权码&#xff0c;输入到 密码框 内即可。 注&#xff1a;一旦开通授权码&#xff0c;在Foxmail验证时 密码框 里输入的就是 授权码

❤css实用

❤ css实用 渐变色边框&#xff08;Gradient borders方法的汇总 5种&#xff09; 给 border 设置渐变色是很常见的效果&#xff0c;实现这个效果有很多思路 1、使用 border-image 使用 css 的 border-image 属性给 border 绘制复杂图样 与 background-image 类似&#xff0c;我…

使用PHP自定义一个加密算法,实现编码配合加密,将自己姓名的明文加密一下

<meta charset"UTF-8"> <?phpfunction customEncrypt($lin, $key mySecretKey){// 定义一个简单的替换规则$li array(L > M, I > Y, Y > O, A > N, E > Q, );$yan ;for($i 0; $i < strlen($lin); $i){$char $lin[$i];if(isset($li[…

第五次作业

作业1&#xff1a;压缩脚本 题目&#xff1a; 1.压缩脚本 写一个脚本&#xff0c;完成如下功能 传递一个参数给脚本&#xff0c;此参数为gzip、bzip2或者xz三者之一&#xff1b; (1) 如果参数1的值为gzip&#xff0c;则使用tar和gzip归档压缩/etc目录至/backups目录中&#xf…

C#使用DateTime.Now.AddDays方法获取任一天的信息

目录 一、使用DateTime对象的AddDays方法获取任一天信息方法 二、举例说明获取昨天的信息 三、涉及到的知识点 1. MessageBox.Show(&#xff09;中信息分行的办法 使用DateTime.Now属性可以得到当前的日期信息&#xff0c;此时调用ToString方法&#xff0c;并在该方法中添加…

84. 柱状图中最大的矩形

单调栈&#xff08;与接雨水类似&#xff09; 思路关键&#xff1a; 要想找到第 i 位置最大面积是什么&#xff1f; 是以 i 为中心&#xff0c;向左找第一个小于 heights[i] 的位置 left_i&#xff1b;向右找第一个小于于 heights[i] 的位置 right_i&#xff0c;即最大面积为…

代码评审——随机数Random问题

问题描述&#xff1a; 为了获取唯一值&#xff0c;经常会依赖产生随机数来保证唯一性。在获取随机数时&#xff0c;如果使用错误的方法&#xff0c;会比较低效。 可以参考以下代码&#xff1a; public static String geneRundomNo(){Random rnew Random();int numr.nextInt(…

【设计模式】适配器模式怎么理解?

什么是转换器模式&#xff1f; 转换器模式是一种结构型设计模式&#xff0c;主要用于在两种不同类型的对象之间进行转换&#xff0c;而不需要改变原型的实际逻辑。这是一种在软件设计中经常使用的模式&#xff0c;它有助于保持代码的整洁和组织。在软件开发中&#xff0c;我们…

中国劳动统计年鉴,涵盖2011-2021年,多项劳动指标可看

基本信息. 数据名称: 中国劳动统计年鉴 数据格式: 其他 数据时间: 2011-2021年 数据几何类型: 无 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 示例数据&#xff1a; 一、综合1-1全国劳动统计主要指标1-2人口数及构成(年末数)1-3国内生产总值及构成1-3续表…

【刷题】 leetcode 面试题 01.06 字符串压缩

字符串压缩 字符串压缩思路一&#xff08;双指针顺畅版&#xff09;思路二&#xff08;sprintf函数巧解版&#xff09; Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下一篇文章见&#xff01;&#xff01;&#xff01; 字符串压缩 来看题目&#xff1a; 根据题目…

vue实现搜索文字高亮

在日常项目中我们往往会有搜索高亮的需求&#xff0c;下面方法可帮助我们实现&#xff0c;可能不是最优但是可以解决 代码实现 <template><div><el-input v-model"searchText" placeholder"Type a word to highlight" input"changei…

C++补充篇- C++11 及其它特性

目录 explicit 关键字 左值和右值的概念 函数返回值当引用 C11 新增容器 - array C的类型转换 static_cast reinterpret_cast dynamic_cast const_cast C智能指针 auto_ptr 使用详解 (C98) unique_ptr 使用详解 (C11) auto_ptr的弊端 unique_ptr严谨auto_ptr的弊端 unique_…