搜索
简帛阁>技术文章>PCL点云文件生成与读取

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 ,随便找个记事本写一下就可以了,代码如下:

#include <iostream> #include <pcl/io/io.h> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/visualization/cloud_viewer.h> using namespace std;   int main (int argc, char** argv) {   pcl::PointCloud<pcl::PointXYZ> cloud;   // Fill in the cloud data   cloud.width    = 5;   cloud.height   = 1;   cloud.is_dense = false;   cloud.points.resize (cloud.width * cloud.height);    for (size_t i = 0; i < cloud.points.size (); ++i)   {     cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);     cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);     cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);   }    pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);   std::cerr << "Saved " << cloud.points.size () << " data points to test_pcd.pcd." << std::endl;    for (size_t i = 0; i < cloud.points.size (); ++i)     std::cerr << "    " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;    getchar();   return (0); } 

再创建CMakeLists.txt

cmake_minimum_required(VERSION 2.6 FATAL_ERROR) project(MY_GRAND_PROJECT) find_package(PCL 1.3 REQUIRED COMPONENTS common io) include_directories(${PCL_INCLUDE_DIRS}) link_directories(${PCL_LIBRARY_DIRS}) add_definitions(${PCL_DEFINITIONS}) add_executable(pcd_write_test pcd_write.cpp) target_link_libraries(pcd_write_test ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES})

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



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


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



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



直接运行,效果如下:


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


点云文件的读取

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

cloud_viewer.cpp

#include <pcl/visualization/cloud_viewer.h> #include <iostream> #include <pcl/io/io.h> #include <pcl/io/pcd_io.h>  int user_data;  void viewerOneOff (pcl::visualization::PCLVisualizer& viewer) {     viewer.setBackgroundColor (0.0, 0.0, 0.0);     pcl::PointXYZ o;     o.x = 1.0;     o.y = 0;     o.z = 0;     viewer.addSphere (o, 0.25, "sphere", 0);     std::cout << "i only run once" << std::endl; 	 }  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(), 200, 300, "text", 0);      //FIXME: possible race condition here:     user_data++; }  int main () {     pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);     pcl::io::loadPCDFile ("bunny.pcd", *cloud);      pcl::visualization::CloudViewer viewer("Cloud Viewer");      //blocks until the cloud is actually rendered     viewer.showCloud(cloud);      //use the following functions to get access to the underlying more advanced/powerful     //PCLVisualizer      //This will only get called once     viewer.runOnVisualizationThreadOnce (viewerOneOff);      //This will get called once per visualization iteration     viewer.runOnVisualizationThread (viewerPsycho);     while (!viewer.wasStopped ())     {     //you can also do cool processing here     //FIXME: Note that this is running in a separate thread from viewerPsycho     //and you should guard against race conditions yourself...     user_data++;     }     return 0; } 


CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)  project(cloud_viewer)  find_package(PCL 1.2 REQUIRED)  include_directories(${PCL_INCLUDE_DIRS}) link_directories(${PCL_LIBRARY_DIRS}) add_definitions(${PCL_DEFINITIONS})  add_executable (cloud_viewer cloud_viewer.cpp) target_link_libraries (cloud_viewer ${PCL_LIBRARIES})

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



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



参考

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


转载于:https://blog.51cto.com/8672742/1368265

提要PCL中创造了一种用于描述空间集的文件PCD关于PCD的简介,可以参考这里http://pointcloudsorg/documentation/tutorials/pcd_file_forma
文章目录1读取指定路径下的pcd2将点云保存至指定路径3stringstream字符串流1读取指定路径下的pcd读取项目路径下的pcdpcl::io::loadPCDFile(testp
章目录前言一、pcd格式数据读取写入二、自定义格式三、自定义bin格式读取存储保存bin读取bin前言主要记录PCL库使用过程中的一些内容,方便自己回看。一、pcd格式数据读取写入读取
1pcd文件——rabbitpcd链接:https://panbaiducom/s/1v6mjPjwd7fIqUSjlIGTIGQ提取码:zspx新建项目pclrabbitpcd和pclcpp在同一目
项目用到了Velodyne的16线激光雷达。雷达产生的数据保存为PCAP格式,解析起来相当麻烦。查了一下PCL的文档,发现PCL专门为Velodyne的雷达提供了支持,提供了HDLGrabber和VL
理论依据假设我们得到了一个,我们想要找到并分割。假设我们使用Kdtree结构来查找最近的邻居,算法步骤是:代码算法的关键在于设置合理提取的阈值,如果取很小的值,它可能把一个对象可以看作是多个群集。
在测量较小的数据时会产生一些误差,这些误差所造成的不规则数据如果直接拿来曲面重建的话,会使得重建的曲面不光滑或者有漏洞,可以采用对数据重采样来解决这样问题,通过对周围的数据点进行高阶多项式插值来重建表
pcl读取pcd文件并显示include<iostream>//标准输入输出流include<pcl/io/pcd_ioh>//PCL的PCD格式文件的输入输出头文件incl
Qt可以跟VTK和PCL等其他库联合使用,十分强大,下面的代码展示了如何使用Qt联合PCL库来加载和保存PCL/PLY格式的:通过按钮加载:voidQMainWindow::on_pb_loa
使用PCL库的时候,经常需要显示,可以用下面这段代码:include<pcl/visualization/cloud_viewerh>pcl::PointCloud<pcl::