Author: 琅琊土肥圆
E-mail: wt_lor@163.com
Date: 2018-09-21
PCL(Point Cloud Library)全称点云库,用于处理LIDAR设备生成的点云数据。截止至本文档的完成之日(2018-09-21),市场主流的LIDAR设备为Velodyne公司提供的。本文基于的设备是Velodyne的16线设备,属于入门级的低密度LIDAR设备。
闲言少叙,进入正题。本文是PCL手记的首作,自然而然的要讲讲如何打开一个pcd文件——保存点云数据的文件,其具体格式可到这里详细了解。具体代码如下所示。
/* pcd_read.cpp */
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
int main(int argc, char **argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCDReader reader;
reader.read<pcl::PointXYZ>("filename.pcd", *cloud);
return 0;
}
逐条解释一下上面的源码。
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
这两行引入pcl的io内容以及点云类型(point_types),本例中使用的点云点因为不含有色彩信息,所以其类型为pcl::PointXYZ。有的LIDAR生成的点云点带有色彩信息,其类型应该为pcl::PointXYZI(带有灰度信息)和/或pcl::PointXYZRGB(带有色彩信息)。
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCDReader reader;
reader.read<pcl::PointXYZ>("filename.pcd", *cloud)
第一行定义一个PointCloud数据结构变量,用于暂存(hold)pcd文件中的点云数据,通过其子域points可以对点云中的点进行 访问(access)。
第二行定义一个PCDReader的对象,用于读取pcd文件。
第三行读取pcd文件。
由于PCL库大量使用了模板编程,所以需要读者对于C++的模板编程比较了解,包括模板函数与模板类。
接下来说明,如何编译前述源文件。由于本身PCL比较庞大,有很多模块——类似于OpenCV库,所以编译使用此类库的源文件时,建议使用cmake,而非带有-L以及-I选项的clang++或者g++。具体的编译文件如下所示,CMakeLists.txt。
cmake_minimum_required(VERSION 3.0)
project(pcd_read)
find_package(
PCL 1.2 REQUIRED
)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_executable(pcd_read ./pcd_read.cpp)
target_link_libraries(pcd_read ${PCL_LIBRARIES})
将该CMakeLists.txt文件和pcd_read.cpp放在同一目录下,在命令行终端运行
$ cmake CMakeLists.txt
即可生成Makefile文件,然后运行
$ make
即可生成可运行文件pcd_read。
网友评论