• PCL入门1之点云读取及可视化


    0 引言

    本文主要记录在Ubuntu系统的PCL点云库安装过程,以及PCL点云读取和可视化c++代码示例。

    1 PCL安装

    本文是安装了pcl1.8大版本,可先下载 下载pcl 1.8.1 版本(点击Source code(zip)

    先安装pcl1.8.1所需的依赖库:

    sudo apt-get update  
    sudo apt-get install git build-essential linux-libc-dev
    sudo apt-get install cmake cmake-gui
    sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
    sudo apt-get install mpi-default-dev openmpi-bin openmpi-common 
    sudo apt-get install libflann1.9 libflann-dev
    sudo apt-get install libeigen3-dev
    sudo apt-get install libboost-all-dev
    sudo apt-get install libvtk7.1-qt libvtk7.1
    sudo apt-get install libqhull* libgtest-dev
    sudo apt-get install freeglut3-dev pkg-config
    sudo apt-get install libxmu-dev libxi-dev
    sudo apt-get install mono-complete
    sudo apt-get install openjdk-8-jdk openjdk-8-jre
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    然后解压下载的pcl1.8.1源码,并进入到pcl1.8.1文件夹中:

    mkdir build
    cd build
    cmake ..
    make -j4
    sudo make install
    
    • 1
    • 2
    • 3
    • 4
    • 5

    测试pcl是否安装成功的话,可用pcl_viewer xxx.pcd
    如果没有pcd文件,可去点云库PCL(Point Cloud Library)的学习资源汇总下载rabbit.pcd

    pcl_viewer rabbit.pcd
    
    • 1

    请添加图片描述

    2 点云读取及可视化

    安装PCL库之后,就像OpenCV读取lena图像一样,PCL入门先编写读取兔子(rabbit.pcd放到了data文件夹中)点云的代码,如下是主要的点云读取和可视化代码,及对应的CMakeLists.txt文件。

    main.cpp文件:

    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main(int argc, char **argv) {
    
        // 创建PointCloud的智能指针
        // pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
        // rabbit.pcd 只有xyz,没有rgb等
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
        // 加载pcd文件到cloud
        if(pcl::io::loadPCDFile("../data/rabbit.pcd", *cloud) == -1){
            PCL_ERROR("No file rabbit.pcd\n");
            return(-1);
        }
        std::cout << cloud->points.size() << std::endl;
        // 点云可视化
        pcl::visualization::CloudViewer viewer("Cloud Viewer");
        viewer.showCloud(cloud);
    
        // 循环判断是否退出
        while (!viewer.wasStopped()) {
            // 后续也可以在这里对点云做很多处理
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    CMakeLists.txt文件:

    cmake_minimum_required(VERSION 2.8)
    project(PCLDemo)
    set(CMAKE_CXX_STANDARD 11)
    
    find_package(PCL REQUIRED)
    # 包含头文件目录
    include_directories(${PCL_INCLUDE_DIRS})
    # 设置依赖库链接目录
    link_directories(${PCL_LIBRARY_DIRS})
    # 添加预处理器和编译器标记
    add_definitions(${PCL_DEFINITIONS})
    
    add_executable(PCLDemo main.cpp)
    target_link_libraries(PCLDemo ${PCL_LIBRARIES})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    PCLDemo文件树:

    .
    ├── CMakeLists.txt
    ├── data
    │   └── rabbit.pcd
    └── main.cpp
    
    • 1
    • 2
    • 3
    • 4
    • 5

    PCLDemo文件夹下新开终端,执行如下命令:

    mkdir build
    cd build
    cmake ..
    make -j4
    # 运行
    ./PCLDemo
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行结果:(可鼠标滚轮缩放)
    请添加图片描述

    如果觉得上图显示的黑色背景有点单调,也可以修改背景色,在上述代码基础上增加viewerOneOff函数和该函数调用viewer.runOnVisualizationThreadOnce(viewerOneOff)

    #include 
    #include 
    #include 
    #include 
    #include 
    
    // 设置可视化背景颜色
    void viewerOneOff(pcl::visualization::PCLVisualizer& viewer);
    
    int main(int argc, char **argv) {
    
        // 创建PointCloud的智能指针
        // pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
        // rabbit.pcd 只有xyz,没有rgb等
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
        // 加载pcd文件到cloud
        if(pcl::io::loadPCDFile("../data/rabbit.pcd", *cloud) == -1){
            PCL_ERROR("No file rabbit.pcd\n");
            return(-1);
        }
        std::cout << cloud->points.size() << std::endl;
        // 点云可视化
        pcl::visualization::CloudViewer viewer("Cloud Viewer");
        viewer.showCloud(cloud);
        // 设置背景颜色
        viewer.runOnVisualizationThreadOnce(viewerOneOff);
    
        // 循环判断是否退出
        while (!viewer.wasStopped()) {
            // 后续也可以在这里对点云做很多处理
        }
        return 0;
    }
    
    void viewerOneOff(pcl::visualization::PCLVisualizer& viewer){
        viewer.setBackgroundColor(1.0f, 0.5f, 0.2f); //(R=1.0)、绿色(G=0.5)和蓝色(B=0.2)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    然后重新编译运行,运行结果如下:

    请添加图片描述


    Reference:




    须知少时凌云志,曾许人间第一流。



    ⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔

  • 相关阅读:
    思科的简易配置
    深度学习概述:从基础概念、计算步骤到调优方法
    【案例】超声波测距系统设计
    如何启用 Podman 的自动容器更新
    【opencv-c++】保存图片文件
    100114. 元素和最小的山形三元组 II
    高效灵活地发现PHP应用程序漏洞
    基于Apache 开源组件搭建大数据集群
    再扩国产化信创版图!朗思科技与中科方德完成产品兼容性互认证
    【文档智能】多模态预训练模型及相关数据集汇总
  • 原文地址:https://blog.csdn.net/MRZHUGH/article/details/134021474