参考引用

  • PCL Basic Usage
  • PCL 点云库官网教程

PCL点云库学习笔记(文章链接汇总)

1. pcl_viewer 基本使用

1.1 pcl_viewer 安装测试

  • pcl_data 源码克隆

    $ git clone https://github.com/PointCloudLibrary/data.git
    
  • 进入 /pcl_data/tutorials(如下图)
    $ cd ~/pcl_data/tutorials  # 此处为重命名后的文件夹 pcl_data
    

  • 查看 .pcd 文件(以 ism_test_cat.pcd 为例)

    $ pcl_viewer ism_test_cat.pcd
    

1.2 pcl_viewer 常用操作

  • 基本使用

    • 进入:pcl_viewer xxxxx.pcd
    • 帮助:在界面中输入 h,可以在控制台看到帮助信息
    • 退出:界面中输入 q
    • 放大缩小:鼠标滚轮 或 Alt + [+/-]
    • 平移:Shift + 鼠标拖拽
    • 旋转:Ctrl + 鼠标拖拽
    • 修改点颜色:数字 1,2,3,4,5…9,重复按 1 可切换不同颜色方便观察
    • 修改点大小:放大 Ctrl + Shift + 加号,缩小 Ctrl + 减号
    • 保存截图:j
    • 显示颜色尺寸:u
    • 显示比例尺寸:g
    • 在控制列出所有几何和颜色信息:l
  • 常用指令

    # 1. 修改背景色或前景色
    $ pcl_viewer ism_test_cat.pcd -bc 255,255,255    # 修改背景色为白色
    $ pcl_viewer ism_test_cat.pcd -fc 0xff,0x0,0x0   # 修改前景色为红色# 2. 设置点大小和不透明度
    $ pcl_viewer ism_test_cat.pcd -ps 4    # 设置点大小为 4
    $ pcl_viewer ism_test_cat.pcd -opaque 0.1    # 设置点透明度为 0.1# 3. 设置坐标轴显示
    $ pcl_viewer ism_test_cat.pcd -ax 64    # 显示大小为 64 的坐标轴
    $ pcl_viewer ism_test_cat.pcd -ax 64 -ax_pos -64,-64,0    # 显示坐标轴并改变其位置(默认 0,0,0)# 4. 格式转换命令
    $ pcl_pcd2ply input.pcd output.ply    # 将 PCD 转为 ply 文件
    $ pcl_mesh2pcd input.{ply,obj} output.pcd   # 将 CAD 模型转为 PCD 文件
    $ pcl_mesh2pcd input.{ply,obj} output.pcd -leaf_size 10   # -leaf_size :修改体素网格的 XYZ 大小,用于增减点的密度# 5. Octrees 八叉树可视化(下图所示)
    $ pcl_octree_viewer ism_test_cat.pcd 0.2    # 0.2 代表分辨率
    #    a -> 增加显示深度(减小体素大小)
    #    z -> 降低显示深度 (增加体素大小)
    #    v -> 隐藏或显示octree立方体
    #    b -> 隐藏或显示体素中心店
    #    n -> 隐藏或显示原始点云
    #    q -> 退出
    

  • 鼠标选点打印坐标

    • 选点模式进入:pcl_viewer -use_point_picking bunny.pcd
    • 选择指定点:shift + 鼠标左键

2. 在项目中使用 PCL

  • 新建项目工作空间 pcl_demo_ws

    $ mkdir pcl_demo_ws
    
  • 在工作空间新建 pcd_write.cpp 文件

    // pcd_write.cpp
    // 随机生成了 5 个点,并将之以 ASCII 形式保存(序列化)在 test_pcd.pcd 文件中
    #include <iostream>
    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>int main(int argc, char **argv) {pcl::PointCloud<pcl::PointXYZ> cloud;// Fill in the cloud datacloud.width = 5;cloud.height = 1;cloud.is_dense = false; // 没有无穷值或 NaN 值cloud.points.resize(cloud.width * cloud.height);std::cout << rand() << std::endl;std::cout << rand() / (RAND_MAX + 1.0f) << std::endl;std::cout << 1024 * rand() / (RAND_MAX + 1.0f) << std::endl;// 随机生成5个点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);}pcl::io::savePCDFileASCII("test_pcd.pcd", cloud);std::cerr << "Saved " << cloud.points.size() << " data points to test_pcd.pcd." << 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;return (0);
    }
    
  • 在工作空间新建 CMakeLists.txt 配置文件

    cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
    project(MY_GRAND_PROJECT)
    find_package(PCL 1.3 REQUIRED COMPONENTS common io)
    include_directories(${PCL_INCLUDE_DIRS})
    link_directories(${PCL_LIBRARY_DIRS})
    add_definitions(${PCL_DEFINITIONS})
    add_executable(pcd_write_test pcd_write.cpp)
    target_link_libraries(pcd_write_test ${PCL_LIBRARIES})
    
  • 编译与执行

    # 编译
    $ mkdir build
    $ cd build
    $ cmake ..
    $ make# 执行
    $ ./pcd_write_test
    
    // 终端输出结果
    1804289383
    0.394383
    -0.106395
    Saved 5 data points to test_pcd.pcd.-0.397406 -0.473106 0.292602-0.731898 0.667105 0.441304-0.734766 0.854581 -0.0361733-0.4607 -0.277468 -0.9167620.183749 0.968809 0.512055
    
  • 查看生成的 test_pcd.pcd 文件

    $ pcl_viewer test_pcd.pcd
    
    • 查看 pcd 内容
    $ cat test_pcd.pcd
    
    # .PCD v0.7 - Point Cloud Data file format
    VERSION 0.7
    FIELDS x y z
    SIZE 4 4 4
    TYPE F F F
    COUNT 1 1 1
    WIDTH 5
    HEIGHT 1
    VIEWPOINT 0 0 0 1 0 0 0
    POINTS 5
    DATA ascii
    -0.3974061 -0.47310591 0.29260206
    -0.73189831 0.66710472 0.44130373
    -0.73476553 0.85458088 -0.036173344
    -0.46070004 -0.2774682 -0.91676188
    0.1837492 0.96880913 0.5120554
    

3. 使用矩阵变换点云

  • 新建项目工作空间 pcl_demo_ws02

    $ mkdir pcl_demo_ws02
    
  • 在工作空间新建 matrix_transform.cpp 文件

    #include <iostream>#include <pcl/io/pcd_io.h>
    #include <pcl/io/ply_io.h>
    #include <pcl/point_cloud.h>
    #include <pcl/console/parse.h>
    #include <pcl/common/transforms.h>
    #include <pcl/visualization/pcl_visualizer.h>int main(int argc, char **argv) {// Load file | Works with PCD and PLY filespcl::PointCloud<pcl::PointXYZ>::Ptr source_cloud(new pcl::PointCloud<pcl::PointXYZ>());if (pcl::io::loadPCDFile(argv[1], *source_cloud) < 0) {std::cout << "Error loading point cloud " << argv[1] << std::endl << std::endl;return -1;}/* Reminder: how transformation matrices work :|-------> This column is the translation| 1 0 0 x |  \| 0 1 0 y |   }-> The identity 3x3 matrix (no rotation) on the left| 0 0 1 z |  /| 0 0 0 1 |    -> We do not use this row (and it has to stay 0,0,0,1)方法一:使用 Matrix4f这个方法容易理解但也容易出错*/Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();float theta = M_PI / 4; // 旋转角(弧度)// 旋转矩阵:沿 z 轴旋转 45°transform_1(0, 0) = cos(theta);  // transform_1(row, column)transform_1(0, 1) = -sin(theta);transform_1(1, 0) = sin(theta);transform_1(1, 1) = cos(theta);// 平移矩阵:沿 x 轴平移 2.5mtransform_1(0, 3) = 2.5;    /*| cos(θ) -sin(θ)  0.0 |R = | sin(θ)  cos(θ)  0.0 |    // 旋转矩阵:沿 z 轴旋转 45°(逆时针)| 0.0     0.0     1.0 |t = < 2.5, 0.0, 0.0 >    // 平移矩阵:沿 x 轴平移 2.5m*/// 打印变换结果printf("Method #1: using a Matrix4f\n");std::cout << transform_1 << std::endl;/*  方法二: 使用 Affine3f这个方法更容易且较少出错*/// 创建仿射变换对象Eigen::Affine3f transform_2 = Eigen::Affine3f::Identity();// 在 z 轴平移 30mtransform_2.translation() << 0.0, 0.0, 30.0;// 绕 Z 旋转 45 度(逆时针)transform_2.rotate(Eigen::AngleAxisf(theta, Eigen::Vector3f::UnitZ()));// 打印仿射变换矩阵printf("\nMethod #2: using an Affine3f\n");std::cout << transform_2.matrix() << std::endl;// 创建变换后的点云pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud(new pcl::PointCloud<pcl::PointXYZ>());// 执行变换,source_cloud 为变换前的点云pcl::transformPointCloud(*source_cloud, *transformed_cloud, transform_2);// 可视化操作printf("\nPoint cloud colors : white = original point cloud\n" "red = transformed point cloud\n");pcl::visualization::PCLVisualizer viewer("Matrix transformation example");// 定义点云的 RGB 值,并将点云添加到查看器中,并通过颜色处理程序pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> source_cloud_color_handler(source_cloud, 255, 255, 255);viewer.addPointCloud(source_cloud, source_cloud_color_handler, "original_cloud");pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> transformed_cloud_color_handler(transformed_cloud, 230, 20, 20); // Redviewer.addPointCloud(transformed_cloud, transformed_cloud_color_handler, "transformed_cloud");// 设置坐标系系统viewer.addCoordinateSystem(0.5, "cloud", 0);// 设置背景色为黑灰色viewer.setBackgroundColor(0.05, 0.05, 0.05, 0);// 设置渲染属性(点大小)viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "original_cloud");viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "transformed_cloud");//viewer.setPosition(800, 400); // Setting visualiser window position// 当按下 q 之前不断循环可视化操作while (!viewer.wasStopped()) { viewer.spinOnce();}return 0;
    }
    
  • 在工作空间新建 CMakeLists.txt 配置文件

    cmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(pcl-matrix_transform)find_package(PCL 1.7 REQUIRED)include_directories(${PCL_INCLUDE_DIRS})
    link_directories(${PCL_LIBRARY_DIRS})
    add_definitions(${PCL_DEFINITIONS})add_executable (matrix_transform matrix_transform.cpp)
    target_link_libraries (matrix_transform ${PCL_LIBRARIES})
    
  • 编译与执行

    # 编译
    $ mkdir build
    $ cd build
    $ cmake ..
    $ make# 执行
    $ ./matrix_transform ism_test_cat.pcd  # 后面跟的 .pcd 或 .ply 文件为需要进行矩阵变换的文件
    
    // 终端输出结果
    Method #1: using a Matrix4f0.707107 -0.707107         0       2.50.707107  0.707107         0         00         0         1         00         0         0         1Method #2: using an Affine3f0.707107 -0.707107         0         00.707107  0.707107         0         00         0         1        300         0         0         1Point cloud colors : white  = original point cloudred  = transformed point cloud
    

PCL学习二:PCL基础应用教程相关推荐

  1. OpenStack(M)+ ubuntu 搭建学习二:基础环境配置

    目录 一.配置网络接口 二.配置域名解析 三 .配置国内的软件源 四. 启用OpenStack库 五.安装OpenStack客户端 六.同步系统时钟与时钟服务器(NTP) 具体步骤可参考官方文档:Op ...

  2. PCL学习笔记-PCL简介

    PCL(点云库)学习笔记 1.简介 点云数据的处理可以采用获得广泛应用的Point Cloud Library(点云库,PCL库). PCL库是一个最初发布于 2013年的开源c++库,它实现了大量点 ...

  3. MVC学习二:基础语法

    目录 一:重载方法的调用 二:数据的传递 三:生成控件 四:显示加载视图 五:强类型视图 六:@Response.Write() 和 @Html.Raw()区别 七:视图中字符串的输入 八:模板页 一 ...

  4. 收藏 | 深度学习之Numpy基础入门教程!

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散   计算机视觉联盟笔记   作者:王博Kings.Sophia (Numerical Python) 是 Pytho ...

  5. Windows编程语言VBA学习(二)——VBA基础

    通过上一篇文章我们可以了解到VBA的使用方式. 这一篇就介绍一下VBA编程的基本语法 在学习之前需要先声明--VBA仅在Microsoft Office软件上有效,使用WPS的话请去查找JSA语法,避 ...

  6. s3c2440芯片累加汇编语言,S3C2440学习二(基础资源的使用)

    ②大概有多少资源模块? ARM处理器共有37个寄存器:1) 31个通用寄存器,包括程序计数器(PC).这些寄存器都是32位的:2)6个状态寄存器.这些寄存器也是32位的,但是只使用了其中的12位. S ...

  7. Python爬虫学习二爬虫基础了解

    1.什么是爬虫 爬虫就是进入网页自动获取数据的程序.当它进入一个网页时,将网页上需要的数据下载下来,并跟踪网页上的其他链接,进入新的页面下载数据,并继续跟踪链接下载数据. 2.URL URL,即统一资 ...

  8. 最新Android基础入门教程目录(完结版)

    第一章:环境搭建与开发相关(已完结 10/10) https://blog.csdn.net/coder_pig/article/details/50000773 Android基础入门教程--1.1 ...

  9. mplus 软件_Mplus基础系列教程(三)

    编者按 公众号本着公益分享,为大家带来了不少学习资源.前一段时间,由于编者精力和能力有限,于是本公众号招聘有志向的志愿者进行一定的创作,很感谢这些报名的勇士,给你们鼓掌,同时,我们也欢迎更多的人加入我 ...

最新文章

  1. 【WebRTC---入门篇】(十)NAT
  2. 前端学习(705):do-while
  3. *【51nod - 1459】迷宫游戏(记录双向权值的Dijkstra单源最短路)
  4. weblogic jprofile配置
  5. LeetCode 网易-1. 分割环(前缀和 + 哈希)
  6. CVPR2020十个顶级开源数据集
  7. 终于来了!Python 编辑神器 Jupyter ,推出首款官方可视化 Debug 工具!
  8. 矩阵特征值的物理意义
  9. 什么样的老板不适合找运营?
  10. 新年+情人节礼物,WinDBG找出你内存溢出的地方
  11. mysql5.7未生成初始密码.mysql_secert文件,登陆数据库
  12. 算法:移除数组中的数字,不用额外空间27. Remove Element
  13. C/C++正则表达式匹配数字范围/小数点后几位
  14. matlab meshlab,MeshLab(网格模型处理软件)下载-MeshLab官方版下载[电脑版]-PC下载网
  15. 【java导出PDF】
  16. Windows垃圾清理BAT脚本
  17. 用python画正弦图的代码_python如何画正弦曲线(jes环境)
  18. 面试的时候我为什么会紧张
  19. mysql异步task_EasySwoole高性能task异步任务
  20. 企业办公新模式,随时随地云上协同!

热门文章

  1. Linux基本命令讲解
  2. 新年特供【供应链作战指北】
  3. Spring三十五问,四万字+五十图详解 建议收藏
  4. last_ack状态及rst标记
  5. Dba常用的sql和视图
  6. 移动ISV大调查系列报告之四——MagicBox的游戏世界
  7. ros中启动rviz显示段错误,核心以转储问题
  8. Webpack | webpack配置eslint
  9. codeMirror 使用教程
  10. C语言sizeof运算符的使用