【PCL】【PCL实践】【PCL的使用学习记录】

  • 0 前言
  • 1 PCL的使用说明
    • 1.1 头文件的使用
    • 1.2 CMakeLists.txt的使用
    • 1.3 代码的使用
      • 1.3.1 定义点云使用的格式
        • 1.3.1.1 XYZRGB格式
      • 1.3.2 新建一个点云
      • 1.3.3 使用五对`RGB图`和`深度图`为点云赋值
      • 1.3.4 点云的大小
      • 1.3.5 保存点云为`.pcd`文件`pcl::io::savePCDFileBinary()`
      • 1.3.6 可视化点云
    • 1.4 额外功能
      • 1.4.1 统计滤波器去除孤立点`pcl::StatisticalOutlierRemoval`
        • 1.4.1.1 头文件
        • 1.4.1.2 实现示例
      • 1.4.2 体素滤波` pcl::VoxelGrid`
        • 1.4.2.1 头文件
        • 1.4.2.2 代码示例
      • 1.4.3 点云的坐标变换函数`pcl::transformPointCloud`
        • 1.4.3.1 函数声明
        • 1.4.3.2 函数举例
      • 1.4.4 PCL实现体素滤波处理和NDT点云匹配` pcl::NormalDistributionsTransform`
        • 1.4.4.1 头文件
        • 1.4.4.2 实现
      • 1.4.5 去除点云中无效点`pcl::removeNaNFromPointCloud()`
        • 1.4.5.1 函数声明
        • 1.4.5.2 函数实现
      • 1.4.6 pcl点云与`.pcl`的存储和读取
        • 1.4.6.1 存储为`.pcl`文件
        • 1.4.6.2 从`.pcl`文件中读取`pcl::io::loadPCDFile()`
        • 1.4.6.3 可以保存的`POINT`格式
      • 1.4.7 CropBox滤波器

0 前言

  • 全文代码参考【slam十四讲第二版】【课本例题代码向】【第五讲~相机与图像】【opencv3.4.1安装】【OpenCV、图像去畸变、双目和RGB-D、遍历图像像素14种】的6 RGB-D视觉

1 PCL的使用说明

1.1 头文件的使用

  1. pcl点云和可视化
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>

1.2 CMakeLists.txt的使用

# pcl
#find_package( PCL REQUIRED COMPONENT common io)
find_package( PCL 1.8 REQUIRED)
set(PCL_INCLUDE_DIRS /usr/include/pcl-1.8)  #指定pcl1.8路径
include_directories( ${PCL_INCLUDE_DIRS} )
add_definitions( ${PCL_DEFINITIONS} )add_executable( xxx src/xxx.cpp )
target_link_libraries( xxx ${OpenCV_LIBS} ${PCL_LIBRARIES} )

1.3 代码的使用

1.3.1 定义点云使用的格式

1.3.1.1 XYZRGB格式

    // 定义点云使用的格式:这里用的是XYZRGBtypedef pcl::PointXYZRGB PointT;typedef pcl::PointCloud<PointT> PointCloud;

1.3.2 新建一个点云

    // 新建一个点云PointCloud::Ptr pointCloud( new PointCloud );

1.3.3 使用五对RGB图深度图为点云赋值

    for ( int i=0; i<5; i++ ){cout<<"转换图像中: "<<i+1<<endl;cv::Mat color = colorImgs[i];cv::Mat depth = depthImgs[i];Eigen::Isometry3d T = poses[i];for ( int v=0; v<color.rows; v++ )for ( int u=0; u<color.cols; u++ ){unsigned int d = depth.ptr<unsigned short> ( v )[u]; // 深度值if ( d==0 ) continue; // 为0表示没有测量到Eigen::Vector3d point;point[2] = double(d)/depthScale;point[0] = (u-cx)*point[2]/fx;point[1] = (v-cy)*point[2]/fy;Eigen::Vector3d pointWorld = T*point;PointT p ;p.x = pointWorld[0];p.y = pointWorld[1];p.z = pointWorld[2];p.b = color.data[ v*color.step+u*color.channels() ];//在OpenCV彩色图像中,通道的默认顺序是B、G、Rp.g = color.data[ v*color.step+u*color.channels()+1 ];p.r = color.data[ v*color.step+u*color.channels()+2 ];pointCloud->points.push_back( p );}}pointCloud->is_dense = false;

1.3.4 点云的大小

    cout<<"点云共有"<<pointCloud->size()<<"个点."<<endl;

输出:

点云共有1081843个点.

1.3.5 保存点云为.pcd文件pcl::io::savePCDFileBinary()

    pcl::io::savePCDFileBinary("map.pcd", *pointCloud );

1.3.6 可视化点云

    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));viewer->setBackgroundColor (0, 0, 0);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(pointCloud);//pointCloud类型为1.3.1和1.3.2的PointCloud::Ptrviewer->addPointCloud<pcl::PointXYZRGB> (pointCloud, rgb, "sample cloud");//pointCloud类型为1.3.1和1.3.2的PointCloud::Ptrviewer->setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");//viewer->addCoordinateSystem (1.0);viewer->initCameraParameters ();while (!viewer->wasStopped ()){//调用spinOnce,给视窗处理事件的时间,可以允许用户和电脑进行交互viewer->spinOnce (100);boost::this_thread::sleep (boost::posix_time::microseconds (100000));}

1.4 额外功能

1.4.1 统计滤波器去除孤立点pcl::StatisticalOutlierRemoval

1.4.1.1 头文件

#include <pcl/filters/statistical_outlier_removal.h>

1.4.1.2 实现示例

  • 利用统计滤波器方法去除孤立点。该滤波器统计每个点与距离它最近的N个点的距离值的分布,去除距离均值过大的点。这样,就保留了那些粘在一起的点,去掉了孤立的噪声点。
  • 参考:【slam十四讲第二版】【课本例题代码向】【第十二讲~建图】【实践:单目稠密重建】【RGBD-稠密建图】的2. RGBD-稠密建图
        // depth filter and statistical removalPointCloud::Ptr tmp(new PointCloud);pcl::StatisticalOutlierRemoval<PointT> statistical_filter;statistical_filter.setMeanK(50);//对每个点分析的邻近点个数设为50statistical_filter.setStddevMulThresh(1.0);statistical_filter.setInputCloud(current);//标准差倍数设为1statistical_filter.filter(*tmp);//注意前面加“*”(*pointCloud) += *tmp;

1.4.2 体素滤波 pcl::VoxelGrid

1.4.2.1 头文件

#include <pcl/filters/voxel_grid.h>

1.4.2.2 代码示例

  • 利用体素网络滤波器进行降采样。由于多个视角存在视野重叠,在重叠区域会存在大量的位置十分相近的点。这会占用许多内存空间。体素滤波保证了在某个一定大小的立方体(或称体素)内仅有一个点,相当于对三维空间进行了降采样,从而节省了很多存储空间。
    // voxel filterpcl::VoxelGrid<PointT> voxel_filter;double resolution = 0.01;voxel_filter.setLeafSize(resolution, resolution, resolution);       // resolutionPointCloud::Ptr tmp(new PointCloud);voxel_filter.setInputCloud(pointCloud);voxel_filter.filter(*tmp);tmp->swap(*pointCloud);

1.4.3 点云的坐标变换函数pcl::transformPointCloud

1.4.3.1 函数声明

  template <typename PointT> void transformPointCloud (const pcl::PointCloud<PointT> &cloud_in, pcl::PointCloud<PointT> &cloud_out, const Eigen::Matrix4f &transform,bool copy_all_fields = true){return (transformPointCloud<PointT, float> (cloud_in, cloud_out, transform, copy_all_fields));}

1.4.3.2 函数举例

已知:

    using POINT = pcl::PointXYZ;using CLOUD = pcl::PointCloud<POINT>;using CLOUD_PTR = CLOUD::Ptr;CLOUD_PTR cloud_ptr;

则:

pcl::transformPointCloud(*cloud_data.cloud_ptr, *cloud_data.cloud_ptr, odometry_matrix);
  • 所以其实还是
pcl::transformPointCloud(pcl::PointCloud<POINT>,pcl::PointCloud<POINT>, Eigen::Matrix4f);

1.4.4 PCL实现体素滤波处理和NDT点云匹配 pcl::NormalDistributionsTransform

1.4.4.1 头文件

#include <pcl/common/transforms.h>

1.4.4.2 实现

  • 【点云配准算法】【NDT】

1.4.5 去除点云中无效点pcl::removeNaNFromPointCloud()

1.4.5.1 函数声明

  • 去除x、y、z等于NaN的点
  template<typename PointT> voidremoveNaNFromPointCloud (const pcl::PointCloud<PointT> &cloud_in, pcl::PointCloud<PointT> &cloud_out, std::vector<int> &index);
  1. cloud_in:输入的点云
  2. cloud_out:输出的点云
  3. index:其值为cloud_out.points[i] = cloud_in.points[index[i]],也就是有效点的的下标位置设置为1,无效点设置为0

1.4.5.2 函数实现

    std::vector<int> indices;pcl::removeNaNFromPointCloud(*cloud_data.cloud_ptr, *current_frame_.cloud_data.cloud_ptr, indices);

1.4.6 pcl点云与.pcl的存储和读取

1.4.6.1 存储为.pcl文件

  1. 函数声明
    template<typename PointT> inline intsavePCDFileBinary (const std::string &file_name, const pcl::PointCloud<PointT> &cloud){PCDWriter w;return (w.write<PointT> (file_name, cloud, true));}
  1. 使用举例
  • 其中new_key_frame.cloud_data.cloud_ptrpcl::PointCloud<pcl::PointXYZ>::Ptr
    std::string file_path = data_path_ + "/key_frames/key_frame_" + std::to_string(global_map_frames_.size()) + ".pcd";pcl::io::savePCDFileBinary(file_path, *new_key_frame.cloud_data.cloud_ptr);

1.4.6.2 从.pcl文件中读取pcl::io::loadPCDFile()

  1. 函数声明
    template<typename PointT> inline intloadPCDFile (const std::string &file_name, pcl::PointCloud<PointT> &cloud){pcl::PCDReader p;return (p.read (file_name, cloud));}
  1. 使用举例
        key_frame_path = data_path_ + "/key_frames/key_frame_" + std::to_string(i) + ".pcd";pcl::io::loadPCDFile(key_frame_path, *key_frame_cloud_ptr);

1.4.6.3 可以保存的POINT格式

  1. pcl::PointXYZ
  2. pcl::PointXYZRGB

1.4.7 CropBox滤波器

  • 使用可以参考从零开始做自动驾驶定位(十四): 基于地图的定位的代码,tag14.0
pcl::CropBox<CloudData::POINT> pcl_box_filter_;//设定边界,矩阵的前三个参数为x,y,z,而最后一个参数应该是噪声
pcl_box_filter_.setMin(Eigen::Vector4f(edge_.at(0), edge_.at(2), edge_.at(4), 1.0e-6));
pcl_box_filter_.setMax(Eigen::Vector4f(edge_.at(1), edge_.at(3), edge_.at(5), 1.0e6));//设置输入的点云,类型为pcl::PointCloud<pcl::PointXYZ>::Ptr
pcl_box_filter_.setInputCloud(input_cloud_ptr);//开始滤波处理,得到的是滤波后的点云
pcl_box_filter_.filter(*output_cloud_ptr);

【PCL】【PCL实践】【PCL的使用学习记录】相关推荐

  1. 2022暑期实践(Django教程学习记录)(第三周1)P44靓号管理-分页组件封装

    P44靓号管理-分页组件封装 要解决的问题,分页和搜索功能不能同时用 from django.http.request import QueryDictimport copyquery_dict = ...

  2. PCL学习记录-Extra-1 pcl::PCLPointCloud2::Ptr和pcl::PointCloud<pcl::PointXYZ> 点云格式区别及相互转化

    转载至:https://www.cnblogs.com/li-yao7758258/p/6659451.html 一. 关于pcl::PCLPointCloud2::Ptr和pcl::PointClo ...

  3. Range_Image深度图-1 PCL学习记录-9 Range_Image深度图原理,以及如何通过点云生成深度图

    一.深度图简介 目前深度图像的获取方法有激光雷达深度成像法,计算机立体视觉成像,坐标测量机法,莫尔条纹法,结构光法等等,针对深度图像的研究重点主要集中在以下几个方面, 深度图像的分割技术 深度图像的边 ...

  4. 点云入门笔记(三):PCL基础以及PCL学习指南

    1.PCL介绍: PCL(Point Cloud Library)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取.滤 ...

  5. 学习PCL库:PCL库中的IO模块介绍

    公众号致力于点云处理,SLAM,三维视觉,高精地图等领域相关内容的干货分享,欢迎各位加入,有兴趣的可联系dianyunpcl@163.com.未经作者允许请勿转载,欢迎各位同学积极分享和交流. IO模 ...

  6. PCL点云库调库学习系列——k-d tree与八叉树

    k-d tree与八叉树 1 k-d tree与八叉树 本文并不涉及具体原理的解释,文章着重在k-d树与八叉树在近邻搜索方面的API的使用 1.1 k-d tree k-d tree算法及原理: ht ...

  7. 微型计算机中的pcl是指,PCL中的类

    1. PCLBase pcl_base.h中定义了PCL中的基类PCLBase,PCL中的大部分算法都使用了其中的方法. PCLBase实现了点云数据及其索引的定义和访问. 两个主要的变量input_ ...

  8. pcl::IOException what() [pcl::PCDWriter::writeASCII] Could not open file for writing

    记录一个愚蠢的问题 用pcl保存点云数据的时候,提示 terminate called after throwing an instance of 'pcl::IOException'what(): ...

  9. PCL:基于PCL绘制包围盒代码实现(2)

    本博客基于pcl::MomentOflnertiaEstimation类获取基于惯性矩(moment of inertia)与偏心率(eccentricity)的描述子,而该类的另一个功能就是提取有向 ...

  10. 错误 对‘pcl::console::print(pcl::console::VERBOSITY_LEVEL, char const*, ...)’未定义的引用

    错误描述 CMakeFiles/robotChassis.dir/src/Motion.cpp.o:在函数'void pcl::detail::FieldMapper<pcl::PointXYZ ...

最新文章

  1. linux shell脚本if,linux的shell脚本中if,for,while的解析与应用
  2. Codevs 1021 玛丽卡
  3. 四个好用却可能不为人所熟知的Pandas函数,建议收藏!!!
  4. Qt Creator调试Qt Quick项目
  5. sublime text3 package control 报错
  6. Teraterm的Log设定
  7. 现代语音信号处理之语音特征参数估计
  8. 使用css实现产品分类,DIV+CSS实现京东商城分类适合所有版本
  9. 算术逻辑单元 —— 串行加法器和并行加法器
  10. CSS——下拉框的制作(以小米商城为例)
  11. 会议OA项目---我的审批(审批会议签字)
  12. 究竟什么才是云计算 云计算的优势都有哪些
  13. linux系统结束vim进程的指令,Linux/Vim命令(持续更新)
  14. Day 01嵌入式学习之Linux基础知识和命令操作
  15. 在美国,男 / 女卫生间(厕所)的正确称呼为什么?请用英语写出答案。
  16. unity接入微信支付完成切换前台游戏闪退
  17. java存储图片到数据库
  18. 查找数组中重复数字并输出
  19. web前端开发发展史,前后30年,展望未来!
  20. 解决Python打开文件报错UnicodeDecodeError: 'gbk' codec can't decode byte

热门文章

  1. 运用Python——劳拉下棋_四连环游戏_重力四子棋游戏(代码与游戏判定)
  2. web前端网页制作 小组作业(制作一个简单的小网页)
  3. 减肥成功,给自己的减肥之路留个纪念(测试博客)
  4. facebook应用中_如何从Facebook应用程序的快捷方式栏中删除图标
  5. 为何卡普空选择在游戏里塑造如此性感妖艳的女性角色
  6. 公司订餐系统Java
  7. CF676A Nicholas and Permutation 题解
  8. warp-transducer源码安装,warprnnt_pytorch生成
  9. 编辑中的word变成只读_教大家word文档变成只读模式怎么改
  10. R_Studio(关联)对Groceries数据集进行关联分析