PCL点云文件生成与读取

提要

     PCL中创造了一种用于描述空间点集的文件  -  PCD.关于PCD的简介,可以参考这里 - http://pointclouds.org/documentation/tutorials/pcd_file_format.php

今天要做的是最简单的事情 - PCD文件的生产与读取。

环境:Win7 64bit VS2010 PCL1.7

PCL编译参考这里 - Window7下手动编译最新版的PCL库


PCD文件生成

     官网推荐的是用cmake来管理工程,在windows中,我们可以通过Cmakegui来生成VS2010的工程,然后导入。这样就免去了在VS中各种添加lib,头文件之苦了 ^^

     首先创建主程序 pcd_write.cpp ,随便找个记事本写一下就可以了,代码如下:

[cpp]  view plain  copy
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. using namespace std;  
  7.   
  8.   
  9. int main (int argc, char** argv)  
  10. {  
  11.   pcl::PointCloud cloud;  
  12.   // Fill in the cloud data  
  13.   cloud.width    = 5;  
  14.   cloud.height   = 1;  
  15.   cloud.is_dense = false;  
  16.   cloud.points.resize (cloud.width * cloud.height);  
  17.   
  18.   for (size_t i = 0; i < cloud.points.size (); ++i)  
  19.   {  
  20.     cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);  
  21.     cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);  
  22.     cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);  
  23.   }  
  24.   
  25.   pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);  
  26.   std::cerr << "Saved " << cloud.points.size () << " data points to test_pcd.pcd." << std::endl;  
  27.   
  28.   for (size_t i = 0; i < cloud.points.size (); ++i)  
  29.     std::cerr << "    " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;  
  30.   
  31.   getchar();  
  32.   return (0);  
  33. }  

再创建CMakeLists.txt

[plain]  view plain  copy
  1. cmake_minimum_required(VERSION 2.6 FATAL_ERROR)  
  2. project(MY_GRAND_PROJECT)  
  3. find_package(PCL 1.3 REQUIRED COMPONENTS common io)  
  4. include_directories(${PCL_INCLUDE_DIRS})  
  5. link_directories(${PCL_LIBRARY_DIRS})  
  6. add_definitions(${PCL_DEFINITIONS})  
  7. add_executable(pcd_write_test pcd_write.cpp)  
  8. target_link_libraries(pcd_write_test ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES})  

在工程目录下创建一个build文件夹,接下来打开CMake-gui,将CMakeList.txt托进去,Configure->Generate.如果环境是配置好的话,结果就像这样:

PCL点云文件生成与读取_第1张图片


如果报错了,基本是你环境没配置好,检查一下该装的东西是否都安装好了,环境变量是否设置好。


成功时候在build文件夹下就生成了对应的vs2010工程了,直接双击打开 MY_GRAND_PROJECT.sln

PCL点云文件生成与读取_第2张图片


导入后在cloud_view上 右击->Set as StartUp Project,如下图

PCL点云文件生成与读取_第3张图片


直接运行,效果如下:

PCL点云文件生成与读取_第4张图片

工程目录下就生成了一个 test_pcd.pcd 点云文件。


点云文件的读取

套路和上面的一样,贴一下代码就好。

cloud_viewer.cpp

[cpp]  view plain  copy
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5.   
  6. int user_data;  
  7.   
  8. void  
  9. viewerOneOff (pcl::visualization::PCLVisualizer& viewer)  
  10. {  
  11.     viewer.setBackgroundColor (0.0, 0.0, 0.0);  
  12.     pcl::PointXYZ o;  
  13.     o.x = 1.0;  
  14.     o.y = 0;  
  15.     o.z = 0;  
  16.     viewer.addSphere (o, 0.25, "sphere", 0);  
  17.     std::cout << "i only run once" << std::endl;  
  18.       
  19. }  
  20.   
  21. void  
  22. viewerPsycho (pcl::visualization::PCLVisualizer& viewer)  
  23. {  
  24.     static unsigned count = 0;  
  25.     std::stringstream ss;  
  26.     ss << "Once per viewer loop: " << count++;  
  27.     viewer.removeShape ("text", 0);  
  28.     viewer.addText (ss.str(), 200, 300, "text", 0);  
  29.   
  30.     //FIXME: possible race condition here:  
  31.     user_data++;  
  32. }  
  33.   
  34. int  
  35. main ()  
  36. {  
  37.     pcl::PointCloud::Ptr cloud (new pcl::PointCloud);  
  38.     pcl::io::loadPCDFile ("bunny.pcd", *cloud);  
  39.   
  40.     pcl::visualization::CloudViewer viewer("Cloud Viewer");  
  41.   
  42.     //blocks until the cloud is actually rendered  
  43.     viewer.showCloud(cloud);  
  44.   
  45.     //use the following functions to get access to the underlying more advanced/powerful  
  46.     //PCLVisualizer  
  47.   
  48.     //This will only get called once  
  49.     viewer.runOnVisualizationThreadOnce (viewerOneOff);  
  50.   
  51.     //This will get called once per visualization iteration  
  52.     viewer.runOnVisualizationThread (viewerPsycho);  
  53.     while (!viewer.wasStopped ())  
  54.     {  
  55.     //you can also do cool processing here  
  56.     //FIXME: Note that this is running in a separate thread from viewerPsycho  
  57.     //and you should guard against race conditions yourself...  
  58.     user_data++;  
  59.     }  
  60.     return 0;  
  61. }  


CMakeLists.txt

[plain]  view plain  copy
  1. cmake_minimum_required(VERSION 2.8 FATAL_ERROR)  
  2.   
  3. project(cloud_viewer)  
  4.   
  5. find_package(PCL 1.2 REQUIRED)  
  6.   
  7. include_directories(${PCL_INCLUDE_DIRS})  
  8. link_directories(${PCL_LIBRARY_DIRS})  
  9. add_definitions(${PCL_DEFINITIONS})  
  10.   
  11. add_executable (cloud_viewer cloud_viewer.cpp)  
  12. target_link_libraries (cloud_viewer ${PCL_LIBRARIES})  

将刚才生成的pcd文件拷贝过来,运行的结果如下:

PCL点云文件生成与读取_第5张图片


由于之前生成的pcd里面仅有一些离散的点,看的不是很明显,加载一个Stanford bunny 的点云(PCL目录下有)来看看。

PCL点云文件生成与读取_第6张图片


参考

Using PCL in your own project - http://pointclouds.org/documentation/tutorials/using_pcl_pcl_config.PHP#using-pcl-pcl-config

讀取 pcd 檔並顯示三維影像 - http://coldnew.github.io/blog/2013/04/12_64cf9.html

The CloudViewer - http://pointclouds.org/documentation/tutorials/cloud_viewer.php#cloud-viewer

你可能感兴趣的:(PCL)