@[TOC]PCL中IO模块的学习
学习背景
参考书籍:《点云库PCL从入门到精通》以及官方代码PCL官方代码链接
学习内容
将PLY数据转化为PCD数据格式。PLY(Polygon File Format 或 Stanford Triangle Format)是一种用于存储三维数据(如点云、网格等)的文件格式。PLYReader类提供了一些方法来读取PLY文件,并将其中的数据加载到PCL中的数据结构中,如pcl::PointCloud或pcl::PCLPointCloud2。
源代码及所用函数
源代码
#include<iostream>
#include<string>
#include<pcl/io/pcd_io.h>//PCD读写类相关的头文件
#include<pcl/io/ply_io.h>//PLY读写类相关头文件
#include<pcl/console/print.h>//提供了用于打印消息和日志的功能
#include<pcl/console/parse.h>//提供了解析命令行参数的功能
#include<pcl/console/time.h>//提供了计时器功能
/* -------------------------------------------------------------------------- */
/* 用于加载PLY文件。它接受一个文件名和一个pcl::PCLPointCloud2对象作为参数。 */
/* ------ 函数内部使用pcl::PLYReader类来读取PLY文件,并将数据存储在pcl::PCLPointCloud2对象中。 ------ */
/* ------------------------- 它还打印了一些信息,如加载时间和点云中的点数。 ------------------------ */
/* -------------------------------------------------------------------------- */
bool loadCloud(const std::string &filename,pcl::PCLPointCloud2 &cloud)
{
pcl::console::TicToc tt;//在PCL中,TicToc是一个用于计时的简单类,它位于pcl/console/time.h头文件中。启动计时器
pcl::console::print_highlight("Loading");//在控制台输出一条高亮显示的消息
pcl::console::print_value("%s",filename.c_str());//打印正在加载的文件名
pcl::PLYReader reader;//read方法的返回值为整数,如果读取成功,返回值大于或等于0,否则返回一个负值,表示读取失败。
tt.tic();//开始计时
if (reader.read(filename,cloud)<0)//将PLY文件中的数据读取到pcl::PCLPointCloud2对象cloud中
{
std::cerr<<"没有"<<std::endl;
return(false);
}
pcl::console::print_info("[donr,");
pcl::console::print_value("%g",tt.toc());
pcl::console::print_info("ms:");
pcl::console::print_value("%d",cloud.width*cloud.height);
pcl::console::print_info("points]\n");
pcl::console::print_info("Available dimensions:");
pcl::console::print_value("%s\n",pcl::getFieldsList(cloud).c_str());//获取点云字段列表并将其转化为C风格字符串打印
return true;
}
void savecloud(const std::string &filename,const pcl::PCLPointCloud2 &cloud,bool format)
{
pcl::console::TicToc tt;
tt.tic();
pcl::console::print_highlight("Saving");
pcl::console::print_value("%s",filename.c_str());
pcl::PCDWriter writer;
//点云数据cloud写入到名为"ply2pcd.pcd"的PCD文件中,并指定点云的原点为零向量Eigen::Vector4f::Zero(),方向为单位四元数Eigen::Quaternionf::Identity()。
writer.write(filename,cloud,Eigen::Vector4f::Zero(),Eigen::Quaternionf::Identity(),format);//存储为PCD类型文件
pcl::console::print_info("[donr,");
pcl::console::print_value("%g",tt.toc());
pcl::console::print_info("ms:");
pcl::console::print_value("%d",cloud.width*cloud.height);
pcl::console::print_info("points]\n");
}
int main(int argc,char**argv)
{
bool format = true;
//读取PLY文件
pcl::PCLPointCloud2 cloud;
if (!loadCloud("/home/jojo/PointCloud/PCLB/IO/06/ply2pcd/test_ply.ply",cloud))
{
return(-1);
}
savecloud("/home/jojo/PointCloud/PCLB/IO/06/ply2pcd/test_pcd.pcd",cloud,format);
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.1 FATAL_ERROR)#指定CMake的最低版本要求为3.1
project(ply2pcd)#设置项目名称
set(CMAKE_CXX_STANDARD 11)#设置C++编译器版本为C++11
find_package(PCL 1.7 REQUIRED)#查找PCL库,要求版本为1.7或更高。
include_directories(${PCL_INCLUDE_DIRS})#将PCL库的头文件目录添加到包含路径中
link_directories(${PCL_LIBRARY_DIRS})#将PCL库的库文件目录添加到链接器搜索路径中。
add_definitions(${PCL_DEFINITIONS})#添加PCL库的编译器定义
add_executable (ply2pcd ply2pcd.cpp)
target_link_libraries (ply2pcd ${PCL_LIBRARIES})#将PCL库链接到可执行文件目标。
结果
函数
1.TicToc是一个用于计时的简单类,它位于<pcl/console/time.h>头文件中,其包含两个用法
tt.tic();//启动计时器,记录当前时间点。
tt.toc();//停止计时器,返回自上次调用tic()以来经过的时间(以毫秒为单位)。
2.控制台打印
pcl::console::print_info();//打印普通的信息消息。
pcl::console::print_warning();// 打印警告消息。
pcl::console::print_error();//打印错误消息。
pcl::console::print_value();//打印带有特定值的消息
3.pcl::PLYReader类
pcl::PLYReader reader;
//read方法的返回值为整数,如果读取成功,返回值大于或等于0,否则返回一个负值,表示读取失败。
reader.read(const std::string &file_name, pcl::PCLPointCloud2 &cloud);//将前者读取到后者
4.pcl::getFieldsList()
//PCL 库中的一个函数,用于获取点云数据中的字段列表,它接受一个 pcl::PCLPointCloud2 对象作为参数
//函数返回一个 std::string 类型的字符串,包含了点云数据中的所有字段名称,字段之间用逗号分隔。
//c_str() 是 std::string 类的一个成员函数,用于获取字符串的 C 风格字符串表示,即以空字符 '\0' 结尾的字符数组。
//在这里,c_str() 函数将 pcl::getFieldsList(cloud) 返回的字符串转换为 C 风格的字符串。
pcl::getFieldsList(cloud).c_str();
5、pcl::PCDWriter类
pcl::PCDWriter writer;
writer.write(const std::string &file_name, const pcl::PCLPointCloud2 &cloud, const Eigen::Vector4f &origin = Eigen::Vector4f::Zero(), const Eigen::Quaternionf &orientation = Eigen::Quaternionf::Identity(), bool binary_mode = true);
//将点云数据 cloud 写入到指定的 PCD 文件 file_name 中,并指定点云的原点 origin 和方向 orientation。binary_mode 参数指定是否以二进制模式写入文件,默认为 ASCII 模式。