【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\n");
        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\n");
        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\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;
}

 

 

 

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\n");
        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;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM