目录
1. PCD文件格式
#.PCD V.7-Point Cloud Data file format
VERSION.7
FIELDS X y zrgb
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 2 1 3
HEIGHT 1
VIEWPOINT 0001000
POINTS 213
DATAascii
0.93773 0.33763 0 4.2108e+06
-
VERSION: 指的是PCD文件的版本
-
FIELDS:指定一个点可以有的每一个维度和字段的名字
-
SIZE:用字节数指定每一个维度的大小
-
TYPE:用一个字符指定每一个维度的类型
-
COUNT:指定每个维度有多少元素,默认没有COUNT时,所有维度的数目被设置为1
-
WIDTH:指定数据集的宽度,根据是有序点云还是无序点云,WIDTH有两层解释:
-
它能确定无序数据集的点云中点的个数(和下面的POINTS 一样)
-
它能确定有序点云数据集的宽度(一行中点的数目)
注意:有序点云数据集,意味着点云是类似于图像(或者矩阵)的结构,数据分为行和列。这种点云的实例包括立体摄像机和时间飞行摄像机生成的数据。有序数据集的优势在于,预先了解相邻点(和像素点类似)的关系,邻域操作更加高效,这样就加速了计算并降低了PCL中某些算法的成本。
-
-
HEIGHT:用点的数目表示点云数据集的高度。类似于WIDTH,HEIGHT也有两层解释。
-
它表示有序点云数据集的高度(行的总数)
-
对于无序数据集,它被设置成1(被用来检查一个数据集是有序还是无序)
有序点云例子:
wIDTH 640 #像图像一样的有序结构,有640行和 480列 HEIGHT 480 #这样该数据集中共有640*480=307200个点 无序点云例子: WIDTH 307200 HEIGHT 1 #有307200个点的无序点云数据集
-
-
VIEWPOINT:指定数据集中点云的获取视点
-
POINTS:指定点云中点的总数
2. 如何使用CMakeLists.txt
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_LIBRARIES})
下面对每行内容进行解释:
cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
此行内容对于cmake 是强制性的,版本要求为2.6【版本大小根据项目需求而定】;
project(MY_GRAND_PROJECT)
project后括号里面是.cpp的文件名;
find_package(PCL 1.3 REQUIRED COMPONENTS common io)
找到最低版本 1.3 的 PCL 包
也可以这么写
find_package(PCL 1.3 REQUIRED COMPONENTS common io) // 只有一个组件 find_package(PCL 1.3 REQUIRED COMPONENTS io common) // 几个组件 find_package(PCL 1.3 REQUIRED ) // 所有
include_directories(${PCL_INCLUDE_DIRS}) link_directories(${PCL_LIBRARY_DIRS}) add_definitions(${PCL_DEFINITIONS})
固定形式,不用管。
add_executable(pcd_write_test pcd_write.cpp)
告诉 cmake 我们正在尝试pcd_write_test
从一个单一的源文件中创建一个名为的可执行文件 pcd_write.cpp
target_link_libraries(pcd_write_test ${PCL_LIBRARIES})
让链接器知道我们链接的库【pcd_write_test 即为项目名称/.cpp文件】
CMake使用步骤
运行 CMake ,并填写以下字段:
Where is the source code
:这是包含 CMakeLists.txt 文件和源代码的文件夹(常命名为source)Where to build the binaries
:这是生成 Visual Studio 项目文件的地方(常命名为cmake_bin)
然后,单击Configure
。系统将提示您输入生成器/编译器。然后单击Generate
按钮。如果没有错误,项目文件将生成到刚刚建立的cmake_bin文件夹中。
打开 .sln 文件,然后构建您的项目!
3. PCD文件读取点云数据
创建 pcd_read.cpp 文件
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
int
main ()
{
//创建一个 PointCloud<PointXYZ> boost 共享指针并对其进行初始化
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
//将 PointCloud 数据从磁盘(我们假设 test_pcd.pcd 已经从上一个教程中创建)加载到二进制 blob 中
if (pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud) == -1) //* load the file
{
PCL_ERROR ("Couldn't read file test_pcd.pcd \n");
return (-1);
}
std::cout << "Loaded "
<< cloud->width * cloud->height
<< " data points from test_pcd.pcd with the following fields: "
<< std::endl;
//显示从文件加载的数据
for (const auto& point: *cloud)
std::cout << " " << point.x
<< " " << point.y
<< " " << point.z << std::endl;
return (0);
}
创建 CMakeLists.txt 文件:
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(pcd_read)
find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable (pcd_read pcd_read.cpp)
target_link_libraries (pcd_read ${PCL_LIBRARIES})
运行;
4. 将点云数据写入 PCD 文件
创建pcd_write.cpp文件;
//第一个文件是包含 PCD I/O 操作定义的头文件
//第二个文件包含几个点类型结构的定义,包括pcl::PointXYZ我们将使用的
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
int
main ()
{
//描述了我们将创建的模板化 PointCloud 结构。每个点的类型设置为pcl::PointXYZ,这是一个具有x、 y和z字段的结构
pcl::PointCloud<pcl::PointXYZ> cloud;
// Fill in the cloud data,用随机值填充点云数据,并设置相应的参数(宽度、高度、is_dense)
cloud.width = 5;
cloud.height = 1;
cloud.is_dense = false;
cloud.resize (cloud.width * cloud.height);
for (auto& point: cloud)
{
point.x = 1024 * rand () / (RAND_MAX + 1.0f);
point.y = 1024 * rand () / (RAND_MAX + 1.0f);
point.z = 1024 * rand () / (RAND_MAX + 1.0f);
}
//将 PointCloud 数据保存到磁盘到名为 test_pcd.pcd 的文件中
pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);
//显示生成的数据
std::cerr << "Saved " << cloud.size () << " data points to test_pcd.pcd." << std::endl;
for (const auto& point: cloud)
std::cerr << " " << point.x << " " << point.y << " " << point.z << std::endl;
return (0);
}
CMakeLists.txt 文件内容如下:
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(pcd_write)
find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable (pcd_write pcd_write.cpp)
target_link_libraries (pcd_write ${PCL_LIBRARIES})
生成可执行文件后;