PCL点云库基础学习笔记(一)

目录

1. PCD文件格式

2. 如何使用CMakeLists.txt

3. PCD文件读取点云数据

4. 将点云数据写入 PCD 文件


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有两层解释:

    1. 它能确定无序数据集的点云中点的个数(和下面的POINTS 一样)

    2. 它能确定有序点云数据集的宽度(一行中点的数目)

      注意:有序点云数据集,意味着点云是类似于图像(或者矩阵)的结构,数据分为行和列。这种点云的实例包括立体摄像机和时间飞行摄像机生成的数据。有序数据集的优势在于,预先了解相邻点(和像素点类似)的关系,邻域操作更加高效,这样就加速了计算并降低了PCL中某些算法的成本。 

  • HEIGHT:用点的数目表示点云数据集的高度。类似于WIDTH,HEIGHT也有两层解释。

    1.  它表示有序点云数据集的高度(行的总数)

    2.  对于无序数据集,它被设置成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})

生成可执行文件后;  

 

 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值