環境: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; }

