zoukankan      html  css  js  c++  java
  • 【PCL学习二】ubuntu pcl 初步使用读取pcd文件

    环境:Ubuntu 16.04

    当我们安装好PCL之后 (安装方法见:【PCL学习一】ubuntu16.04 安装 pcl),我们使用pcl来3D显示一个pcd文件内容

    下载一个pcd文件 rabbit.pcd

    链接:https://pan.baidu.com/s/1VWbTInrZ3Z9g23baage7ow
    提取码:2ins

    将rabbit.pcd文件放在文件夹中,打开终端输入    

     pcl_viewer  rabbit.pcd

    滚动鼠标滚轮,可以看到兔子的3D点云

    二、编写程序 读取pcd文件内容

    1、在pcd文件同级目录下创建  pcl_test.cpp  CMakeLists.txt

    CMakeList.txt

    cmake_minimum_required(VERSION 2.6)
    project(pcl_test)
    
    find_package(PCL 1.2 REQUIRED)
    
    include_directories(${PCL_INCLUDE_DIRS})
    link_directories(${PCL_LIBRARY_DIRS})
    add_definitions(${PCL_DEFINITIONS})
    
    add_executable(pcl_test pcl_test.cpp)
    
    target_link_libraries (pcl_test ${PCL_LIBRARIES})
    
    install(TARGETS pcl_test RUNTIME DESTINATION bin)

    pcl_test.cpp

    #include<iostream>
    #include<pcl/io/pcd_io.h>
    #include<pcl/point_types.h>
    
    int main(int argc, char** argv)
    {
         //创建了一个名为cloud的指针,储存XYZ类型的点云数据
         pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
         //*打开点云文件
         if (pcl::io::loadPCDFile<pcl::PointXYZ>("rabbit.pcd", *cloud) == -1) {
            PCL_ERROR("Couldn't read file rabbit.pcd
    ");
            return(-1);
        }
        std::cout << "Loaded:" << cloud->width*cloud->height<<"data points from test_pcd.pcd with the following fields:"<< std::endl;
        //输出点云数据
        for (size_t i = 0; i < cloud->points.size(); ++i) {
            std::cout << "      " << cloud->points[i].x << "   " << cloud->points[i].y << "   " << cloud->points[i].z << "   " << std::endl;
        }

      //也可以使用以下的语句
    /*
    for (const auto& point: *cloud) std::cout << " " << point.x << " " << point.y << " " << point.z << std::endl;
    */
    return 0; }

    说明:

      PointCloud是PCL中的一个基类,pcl::PointCloud<pcl::PointXYZ>::Ptr是一个Boost共享指针

      PointCloud中的数据域  

        width(int),如果是无组织,无结构的点云数据,表示点云的个数;如果是有结构的点云数据,表示点云数据集一行的点数。

        height(int),如果是无结构的点云数据,height=1;如果是有结构的点云数据,height表示点云总行数。

        points(std::vector)存储了数据类型为PointT的一个动态数组。

      PointXYZ 是最常见的一个点数据类型,它只包含三维X,Y,Z坐标信息

        X:points[i].x

      size_t 整型,保存一个整数,记录一个大小(size)

      points.size() 表示点云数据大小

    在终端中输入

    cmake .
    make

    生成可执行程序pcl_test

    运行 pcl_test 可看到点云数据

    2、 数据可视化

    pcl_test.cpp

    #include<iostream>
    #include<pcl/io/pcd_io.h>
    #include<pcl/point_types.h>
    #include <pcl/visualization/cloud_viewer.h>
    
    int main(int argc, char** argv) {
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    
        //*打开点云文件
        if (pcl::io::loadPCDFile<pcl::PointXYZ>("rabbit.pcd", *cloud) == -1) {
            PCL_ERROR("Couldn't read file rabbit.pcd
    ");
            return(-1);
        }
        std::cout << cloud->points.size() << std::endl;
        pcl::visualization::CloudViewer viewer("cloud viewer");
        viewer.showCloud(cloud);
        while (!viewer.wasStopped()) {
    
        }
    return 0;
    }

    终端中重新编译 

    make
    ./pcl_test

    3、修改背景

    pcl_test.cpp

    #include<iostream>
    #include<pcl/io/pcd_io.h>
    #include<pcl/point_types.h>
    #include <pcl/visualization/cloud_viewer.h>
    void viewerOneOff(pcl::visualization::PCLVisualizer& viewer) {
        viewer.setBackgroundColor(1.0f, 0.5f, 1.0f);
    }
    
    int main(int argc, char** argv) {
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    
        //*打开点云文件
        if (pcl::io::loadPCDFile<pcl::PointXYZ>("rabbit.pcd", *cloud) == -1) {
            PCL_ERROR("Couldn't read file rabbit.pcd
    ");
            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;
    }

    4、

     pcl_test.cpp

    #include<iostream>
    #include<pcl/io/pcd_io.h>
    #include<pcl/point_types.h>
    #include <pcl/visualization/cloud_viewer.h>
    
    int user_data;
    void viewerOneOff(pcl::visualization::PCLVisualizer& viewer) {
        viewer.setBackgroundColor(1.0f, 0.5f, 1.0f);
    }
    void
    viewerPsycho(pcl::visualization::PCLVisualizer& viewer)
    {
        static unsigned count = 0;
        std::stringstream ss;
        ss << "Once per viewer loop: " << count++;
        viewer.removeShape("text", 0);
        viewer.addText(ss.str(), 20, 100, "text", 0);//this is to set the coordination of text "Once per viewer loop:"
        user_data++;
    }
    int main(int argc, char** argv) {
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    
        //*打开点云文件
        if (pcl::io::loadPCDFile<pcl::PointXYZ>("rabbit.pcd", *cloud) == -1) {
            PCL_ERROR("Couldn't read file rabbit.pcd
    ");
            return(-1);
        }
        std::cout << cloud->points.size() << std::endl;
        pcl::visualization::CloudViewer viewer("cloud viewer");
        viewer.showCloud(cloud);
        viewer.runOnVisualizationThreadOnce(viewerOneOff);
        viewer.runOnVisualizationThread(viewerPsycho);
        while (!viewer.wasStopped()) {
    
        }
        return 0;
    }

    Talk is cheap, show me the code
  • 相关阅读:
    Jenkins持续集成
    爬豆瓣保存到sqlite3
    爬豆瓣保存到Excel
    sqlite3数据库的增删查改
    用pandas和matplotlib对用户消费行为分析
    TCP请求
    fastjson
    断言
    将结果写入文件
    加解密
  • 原文地址:https://www.cnblogs.com/birdBull/p/14467655.html
Copyright © 2011-2022 走看看