Ubuntu 18.04.06PCLC++学习记录(二)上

本文介绍了如何在PCL库中使用PLYReader类将PLY数据转换为PCD格式,包括读取PLY文件、计时操作以及使用PCDWriter类保存转换后的数据。作者还展示了如何使用TicToc类进行计时,以优化性能。
摘要由CSDN通过智能技术生成

@[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 模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值