最近发现了一个很好的博客:https://blog.csdn.net/longer88888/article/details/104751036,里面对pcl和相关滤波解释的相当清楚。朱德海老师书中源码下载:https://download.csdn.net/download/courage_jj/11214951?utm_source=bbsseo;

由于版本的问题,书中的一些代码已经有所变化,在这写出自己编译时遇到的一些问题,我的环境是VS2017+PCL1.9.1+QT5.9.1+VTK8.1.0

(1)6.1passthrough【顺利编译】

#include <iostream>
#include <ctime>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>int main(int argc, char ** argv)
{srand(time(0));pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud < pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(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 = rand() / (RAND_MAX + 1.0f) - 0.5;cloud->points[i].y = rand() / (RAND_MAX + 1.0f) - 0.5;cloud->points[i].z = rand() / (RAND_MAX + 1.0f) - 0.5;}std::cerr << "cloud before filtering" << 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;//创建滤波器对象pcl::PassThrough<pcl::PointXYZ>pass;//设置输入点云pass.setInputCloud(cloud);//设置过滤时所需要点云类型的z字段pass.setFilterFieldName("z");//设置保留范围内的还是范围外的pass.setFilterLimits(0.0, 1.0);//执行过滤,保存过滤结果在cloud_filteredpass.filter(*cloud_filtered);std::cerr << "下面是过滤后的结果" << std::endl;for (size_t i = 0; i < cloud_filtered->points.size(); ++i)std::cerr << " " << cloud->points[i].x << "" << cloud->points[i].y << cloud->points[i].z << std::endl;return 0;
}

(2)6.2Voxel_grid 【遇到问题,sensor_msgs不是类命名空间】-》【在PCL1.8中将PointCloud2加入了pcl名字空间,sensor_msgs是旧的方式,不再使用。】

参考博客:https://blog.csdn.net/zfjBIT/article/details/92595768

修改为:

pcl::PCLPointCloud2::Ptr cloud(new pcl::PCLPointCloud2());pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());

整体代码为:

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>int main(int argc, char**argv)
{//创建点云空间std::cerr << "star" << std::endl;pcl::PCLPointCloud2::Ptr cloud(new pcl::PCLPointCloud2());pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());// 填入点云数据pcl::PCDReader reader;// 把路径改为自己存放文件的路径,复制到pcd点云文件到文件下reader.read("table_scene_lms400.pcd", *cloud); std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height<< " data points (" << pcl::getFieldsList(*cloud) << ").";// 创建滤波器对象pcl::VoxelGrid<pcl::PCLPointCloud2> sor;//给滤波对象设置需要过滤的点云sor.setInputCloud(cloud);//设置滤波时创建的提速大小为1cm立方体sor.setLeafSize(0.01f, 0.01f, 0.01f);//执行滤波处理sor.filter(*cloud_filtered);std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height<< " data points (" << pcl::getFieldsList(*cloud_filtered) << ").";//保存点云文件pcl::PCDWriter writer;//cloud_filtered.pcda为保存的点云名称writer.write("cloud_filtered.pcd", *cloud_filtered,Eigen::Vector4f::Zero(), Eigen::Quaternionf::Identity(), false);return 0;}

(3)statistical_removal【移除离散点】

#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;// 创建滤波器对象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);sor.setNegative(true);sor.filter(*cloud_filtered);writer.write<pcl::PointXYZ>("table_scene_lms400_outliers.pcd", *cloud_filtered, false);return (0);
}

(4)project_inliers.cpp【投影点云,没问题】

#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 = 20;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;// 创建一个系数为X=Y=0,Z=1的平面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;// 创建滤波器对象pcl::ProjectInliers<pcl::PointXYZ> 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);
}

(5) extract 从一个点云中提取一个子集,里面用了sensor_mags,因为在pcl1.8中,整合到了pcl::pclcloud2中,因此进行替换

#include <iostream>
#include <pcl/ModelCoefficients.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/extract_indices.h>
int
main(int argc, char** argv)
{pcl::PCLPointCloud2::Ptr cloud_blob(new pcl::PCLPointCloud2), cloud_filtered_blob(new pcl::PCLPointCloud2);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>), cloud_p(new pcl::PointCloud<pcl::PointXYZ>), cloud_f(new pcl::PointCloud<pcl::PointXYZ>);// 填入点云数据pcl::PCDReader reader;reader.read("table_scene_lms400.pcd", *cloud_blob);std::cerr << "PointCloud before filtering: " << cloud_blob->width * cloud_blob->height << " data points." << std::endl;// 创建滤波器对象:使用叶大小为1cm的下采样pcl::VoxelGrid<pcl::PCLPointCloud2> sor;sor.setInputCloud(cloud_blob);sor.setLeafSize(0.01f, 0.01f, 0.01f);sor.filter(*cloud_filtered_blob);// 转化为模板点云pcl::fromPCLPointCloud2(*cloud_filtered_blob, *cloud_filtered);std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height << " data points." << std::endl;// 将下采样后的数据存入磁盘pcl::PCDWriter writer;writer.write<pcl::PointXYZ>("table_scene_lms400_downsampled.pcd", *cloud_filtered, false);pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());pcl::PointIndices::Ptr inliers(new pcl::PointIndices());// 创建分割对象pcl::SACSegmentation<pcl::PointXYZ> seg;// 可选seg.setOptimizeCoefficients(true);// 必选seg.setModelType(pcl::SACMODEL_PLANE);seg.setMethodType(pcl::SAC_RANSAC);seg.setMaxIterations(1000);seg.setDistanceThreshold(0.01);// 创建滤波器对象pcl::ExtractIndices<pcl::PointXYZ> extract;int i = 0, nr_points = (int)cloud_filtered->points.size();// 当还有30%原始点云数据时while (cloud_filtered->points.size() > 0.3 * nr_points){// 从余下的点云中分割最大平面组成部分seg.setInputCloud(cloud_filtered);seg.segment(*inliers, *coefficients);if (inliers->indices.size() == 0){std::cerr << "Could not estimate a planar model for the given dataset." << std::endl;break;}// 分离内层extract.setInputCloud(cloud_filtered);extract.setIndices(inliers);extract.setNegative(false);extract.filter(*cloud_p);std::cerr << "PointCloud representing the planar component: " << cloud_p->width * cloud_p->height << " data points." << std::endl;std::stringstream ss;ss << "table_scene_lms400_plane_" << i << ".pcd";writer.write<pcl::PointXYZ>(ss.str(), *cloud_p, false);// 创建滤波器对象extract.setNegative(true);extract.filter(*cloud_f);cloud_filtered.swap(cloud_f);i++;}return (0);
}

——————————————————————(未完待续)———————————————————————————

《PCL从入门到精通学习》第六章点云滤波相关推荐

  1. 【翻译】WF从入门到精通(第六章):加载和卸载实例

    上一篇:[翻译]WF从入门到精通(第五章):workflow跟踪 学习完本章,你将掌握:     1.理解工作流实例为什么要卸载和重新加载及其时机     2.理解工作流实例为什么要持久化及其时机   ...

  2. 操作-《oracle入门到精通》第六章开始

    转载于:https://www.cnblogs.com/smallpigger/p/8320837.html

  3. Revit二次开发从入门到精通学习之路, (含Revit二次开发教程下载)

    Revit二次开发从入门到精通学习之路 Autodesk Joe Ye叶雄进 2. 18 2014    yexiongjin@hotmail.com Revit在国内的应用越来越广泛, Revit ...

  4. 第1课 EOS开发从入门到精通学习导航

    第1课 EOS开发从入门到精通学习导航 柚子(EOS)可以理解为Enterprise Operation System,即为商用分布式应用设计的一款区块链操作系统.EOS是EOS软件引入的一种新的区块 ...

  5. 《Python网络爬虫——从入门到实践》第六章将数据存储至MySQL数据库的学习心得与总结(出错与纠正方法)

    <Python网络爬虫--从入门到实践>第六章将数据存储至MySQL数据库的学习心得与总结(出错与纠正方法) 作为刚开始入门python的小白,对大数据,网络爬虫比较感兴趣.完全是自我修炼 ...

  6. python web开发入门_python大佬整理的python web开发从入门到精通学习笔记

    原标题:python大佬整理的python web开发从入门到精通学习笔记 Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通 ...

  7. STM32固件库(标准外设库)入门学习 第六章TIM定时器(一)

    STM32固件库(标准外设库)入门学习 第六章TIM定时器(一) 文章目录 STM32固件库(标准外设库)入门学习 第六章TIM定时器(一) 前言 一.定时器类型 1 基本定时器 2 通用定时器 3 ...

  8. ROS机器人程序设计(原书第2版)补充资料 (陆) 第六章 点云 PCL

    ROS机器人程序设计(原书第2版)补充资料 (陆) 第六章 点云 PCL 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. RGBD深度摄像头 ...

  9. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

最新文章

  1. 用Ajax 构建关键任务的企业级Web 应用 ——《深入 Ajax :架构与最佳实践》
  2. 【智力问题】25匹马赛跑,每次只能跑5匹马,最快能赛几次找出跑得最快的3匹马?赛跑不能计时,并假设每匹马的速度是恒定不变的。...
  3. 计算机风冷散热系统的原理,显卡“发烧”的原因_显卡散热原理
  4. 稀疏数组与二维数组相互转化
  5. OpenJudge NOI 1.7 22:紧急措施
  6. 1000道Python题库系列分享21(11道编程题:内置函数专项练习)
  7. 怎么把AI文件导入到PS里面
  8. JAVA---MYSQL 基本知识点 第一部分
  9. SYN Flood应如何应对
  10. Springboot基于thymeleaf的一个简单的学生管理系统
  11. Eclipse的环境变量如何配置和为什么要配置环境变量?
  12. 获取JSON文本(复嵌对象)转换指定JSON数据并Ajax实现数据初始可视化【附上echarts地图官方数据形式json文件数据】
  13. 搜索引擎自动提交连接php文件,死链检测工具(自动提交给百度,逆天了)
  14. 西门子mag6000接线_西门子MAG5000/6000电磁流量计应用及安装
  15. 北京中国石油大学计算机考研分数线,中国石油大学(北京)2018年考研复试基本分数线...
  16. 语音识别软件_语音识别 软件_日语语音识别软件 - 云+社区 - 腾讯云
  17. 正则验证车牌号(含新能源)
  18. html表白程序源码_表白程序源码html_程序员表白代码html
  19. 数据仓库系列--维度表技术
  20. 考研 研究生 什么是考研 考研的第一课 全面了解考研 研究生

热门文章

  1. M1 Mac安装 PS 2021 闪退、卡启动界面解决方法
  2. android直播怎么投屏,安卓手机怎么直播,Total Control手游投屏教程
  3. 由网易云音乐跑步FM功能引申出的一些产品设计思路相关的粗浅看法
  4. 数控铣削图案及编程_数控铣床编程30例带图 急!!数控编程实例 带图案的
  5. java定义一个eat方法_Java继承概念详细解读
  6. 三个基本的布尔逻辑算符是_布尔逻辑算符.ppt
  7. curl put请求
  8. How to install and configure NGINX on CentOS 7
  9. B-样条曲线:开曲线
  10. java基础 equals与hashCode