PCL读取显示点云的两种方式

2023-10-26

读取点云的两种方式

PCL提供了两种pcd点云读写方式,其中PCD(Point Cloud Date,点云数据)对应的文件格式为 (*.pcd),是 PCL官方指定格式,具有 ASCIIBinary 两种数据存储类型。

其中 ASCII 格式的点云可以直接用记事本查看;

Binary 格式的点云无法用记事本查看,但速度更快。

方式1 PCDReader;PCDWriter

方式2 loadPCDFile;savePCDFile

1、从硬盘中读取点云

1.1 loadPCDFile

#include <pcl/io/pcd_io.h>

using namespace std;

int main()
{
	//-------------------------------- 从硬盘中读取点云 -----------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>); //创建存放读取点云的对象
	if (pcl::io::loadPCDFile("test.pcd", *cloud_in) < 0)
	{
		PCL_ERROR("\a->点云文件不存在!\n");
		system("pause");
		return -1;
	}
	cout << "->加载了 " << cloud_in->points.size() << " 个数据点" << endl;
	//==============================================================================

	return 0;
}

1.2 PCDReader

#include <pcl/io/pcd_io.h>

using namespace std;

int main()
{
	//-------------------------------- 从硬盘中读取点云 -----------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>); //创建存放读取点云的对象
	pcl::PCDReader reader;	//定义点云读取对象
	if (reader.read("test.pcd", *cloud_in) < 0)
	{
		PCL_ERROR("\a->点云文件不存在!\n");
		system("pause");
		return -1;
	}
	cout << "->加载了 " << cloud_in->points.size() << " 个数据点" << endl;
	//==============================================================================

	return 0;
}

2、将点云保存到硬盘中

2.1 savePCDFile

savePCDFile 有两种常用的存储格式,一种是 savePCDFileASCII,另一种是 savePCDFileBinary,两种方式按照需求选择其中一种即可。

#include <pcl/io/pcd_io.h>
using namespace std;

int main()
{
	//-------------------------------- 从硬盘中读取点云 -----------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>); //存放读取点云的对象
	pcl::PCDReader reader;	//定义点云读取对象
	if (reader.read("test.pcd", *cloud_in) < 0)
	{
		PCL_ERROR("\a->点云文件不存在!\n");
		system("pause");
		return -1;
	}
	cout << "->加载了 " << cloud_in->points.size() << " 个数据点" << endl;
	//==============================================================================
	//------------------------------- 将点云投影至XOY平面 ----------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>); //存放投影后的点云

	//定义cloud_out的大小等参数,防止下标越界
	cloud_out->width = cloud_in->width;
	cloud_out->height = 1;
	cloud_out->is_dense = true;
	cloud_out->points.resize(cloud_out->width*cloud_out->height);

	for (size_t i = 0; i < cloud_in->points.size(); i++)
	{
		cloud_out->points[i].x = cloud_in->points[i].x;
		cloud_out->points[i].y = cloud_in->points[i].y;
		cloud_out->points[i].z = 0;
	}
	//-------------------------------- 将点云保存到硬盘 -----------------------------
	///保存为ASICC格式,可以直接用记事本打开
	if (!cloud_out->empty())
	{
		pcl::io::savePCDFileASCII("ASICC_1.pcd", *cloud_out);
		cout << "->(ASICC)保存点数为:" << cloud_out->points.size() << endl;
	}
	else
	{
		PCL_ERROR("\a->保存点云为空!\n");
		system("pause");
		return -1;
	}

	///保存为Binary格式,不可用记事本打开,但更快速。
	if (!cloud_out->empty())
	{
		pcl::io::savePCDFileBinary("Binary_1.pcd", *cloud_out);
		cout << "->(Binary)保存点数为:" << cloud_out->points.size() << endl;
	}
	else
	{
		PCL_ERROR("\a->保存点云为空!\n");
		system("pause");
		return -1;
	}
//==============================================================================
	return 0;
}

2.2 PCDWriter

#include <pcl/io/pcd_io.h>

using namespace std;

int main()
{
	//-------------------------------- 从硬盘中读取点云 -----------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>); //存放读取点云的对象
	pcl::PCDReader reader;	//定义点云读取对象
	if (reader.read("test.pcd", *cloud_in) < 0)
	{
		PCL_ERROR("\a->点云文件不存在!\n");
		system("pause");
		return -1;
	}
	cout << "->加载了 " << cloud_in->points.size() << " 个数据点" << endl;
//==============================================================================
	//------------------------------- 将点云投影至XOY平面 ----------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>); //存放投影后的点云

	//定义cloud_out的大小等参数,防止下标越界
	cloud_out->width = cloud_in->width;
	cloud_out->height = 1;
	cloud_out->is_dense = true;
	cloud_out->points.resize(cloud_out->width*cloud_out->height);

	for (size_t i = 0; i < cloud_in->points.size(); i++)
	{
		cloud_out->points[i].x = cloud_in->points[i].x;
		cloud_out->points[i].y = cloud_in->points[i].y;
		cloud_out->points[i].z = 0;
	}
	//-------------------------------- 将点云保存到硬盘 -----------------------------
	pcl::PCDWriter writer;
	///保存为ASICC格式,可以直接用记事本打开
	if (!cloud_out->empty())
	{
		writer.write("ASICC_2.pcd", *cloud_out,false);	//默认false(可以不写),保存为ASICC格式
		cout << "->(ASICC)保存点数为:" << cloud_out->points.size() << endl;
	}
	else
	{
		PCL_ERROR("\a->保存点云为空!\n");
		system("pause");
		return -1;
	}
	///保存为Binary格式,不可用记事本打开,但更快速。
	if (!cloud_out->empty())
	{
		writer.write("Binary_2.pcd", *cloud_out, true);	//true,保存为Binary格式
		cout << "->(Binary)保存点数为:" << cloud_out->points.size() << endl;
	}
	else
	{
		PCL_ERROR("\a->保存点云为空!\n");
		system("pause");
		return -1;
	}
//==============================================================================
	return 0;
}

3、 两种读写点云方式的区别

PCDReader和loadPCDFile的区别

//PCDReader
pcl::PCDReader reader;
reader.read("1.pcd",*cloud);

//loadPCDFile
pcl::io::loadPCDFile("1.pcd",*cloud);
  • PCDWriter与savePCDFile的区别
//PCDWriter
pcl::PCDWriter writer;
writer.write("1.pcd",*cloud);

//savePCDFile
pcl::io::savePCDFileBinary("1.pcd",*cloud);

同样的,savePCDFile函数也是调用PCDWriter实现

//savePCDFile 
template<typename PointT> inline int
    savePCDFile (const std::string &file_name, const pcl::PointCloud<PointT> &cloud, bool binary_mode = false)
    {
      PCDWriter w;
      return (w.write<PointT> (file_name, cloud, binary_mode));
    }
//savePCDFileASCII 
template<typename PointT> inline int
    savePCDFileASCII (const std::string &file_name, const pcl::PointCloud<PointT> &cloud)
    {
      PCDWriter w;
      return (w.write<PointT> (file_name, cloud, false));
    }
//savePCDFileBinary
template<typename PointT> inline int
    savePCDFileBinary (const std::string &file_name, const pcl::PointCloud<PointT> &cloud)
    {
      PCDWriter w;
      return (w.write<PointT> (file_name, cloud, true));
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCL读取显示点云的两种方式 的相关文章

  • pthread_create 编译返回错误

    我使用以下代码创建两个线程 header files include
  • 将 void* 作为函数调用而不声明函数指针

    我已经搜索过 但找不到任何结果 我的术语可能有问题 所以如果以前有人问过这个问题 请原谅我 我想知道是否有一种简单的方法可以调用void 作为 C 中的函数 无需首先声明函数指针 然后为函数指针分配地址 IE 假设要调用的函数是类型void
  • 访问二维数组的一行末尾之后的元素是否是 UB?

    以下程序的行为是否未定义 include
  • lua_resume 的 from 参数的含义

    From Lua 5 2 参考手册 http www lua org manual 5 2 manual html lua resume int lua resume lua State L lua State from int nargs
  • 如果文本框不为空,如何添加并显示工具提示文本框 WPF

    需要显示提示 其中包含文本字段中的数据 文本框有数据时出现提示 只需使用绑定到 ToolTipService 附加属性即可 XAML
  • 使用 Xlib 捕获鼠标

    我想编写一个简单的 Xlib 程序来改变鼠标行为 举个例子 反转垂直移动 我在捕获事件时遇到问题 我想要代码 捕获控制器位置的变化 我向上移动鼠标 MotionEvent 计算新的光标位置 new x difference x 设置新的光标
  • M1 MacBook Pro 和 cmake 的编译错误

    我刚刚拿到了新的 M1 MacBook Pro 正在尝试编译大学工作所需的代码库 以下是我已采取的步骤 我使用 Rosetta 将终端设置为始终打开 安装的自制程序using bin bash c curl fsSL https raw g
  • fgets 和 fread 之间的区别

    我有以下代码 include
  • FormsAuthentication.SetAuthCookie() 是否需要重定向?

    检查用户的凭据并确认其良好后 我正在使用FormsAuthentication SetAuthCookie Username false 对用户进行身份验证 然后在母版页中我使用Page User Identity IsAuthentica
  • 不区分大小写“包含(字符串)”

    有没有办法让下面的返回为真 string title ASTRINGTOTEST title Contains string 似乎没有过载允许我设置区分大小写 目前我将它们都大写 但这很愚蠢 我指的是i18n http en wikiped
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • MVC Razor for 循环

    我有这段代码 嵌套在表单帖子内 但我不断收到错误 它缺少结束语 for int i 0 i lt itemsCount i
  • dev_t 和 ino_t 是否必须是整数类型?

    glibc 的文档保留它们是整数类型 不比 unsigned int 窄 但我没有找到说明它们必须是整数类型的标准参考 另请参阅 time t 所以最后 问题就变成了 include
  • 如何从 .NET DataGridView 控件单元格值写入文本文件?

    我有以下代码应该循环遍历我的所有行DataGridView 并将其所有单元格值写入文本文件 但是 它输出所有行 但仅输出每行的第一个单元格 而不输出其他三个单元格 string file name C test1 txt var objWr
  • 缓冲区溢出(与)缓冲区溢出(与)堆栈溢出[重复]

    这个问题在这里已经有答案了 可能的重复 堆栈溢出和缓冲区溢出有什么区别 https stackoverflow com questions 1120575 what is the difference between a stack ove
  • 如何在 C# 中获取包含表情符号的字符串的正确长度

    The 英语国旗表情符号 https emojipedia org flag for england 由 14 个字节的数据组成 组合后将呈现一个字符 如果我有如下所示的代码 var test ud83c udff4 udb40 udc67
  • 何时使用 const char * 何时使用 const char[]

    我知道它们是不同的 我知道它们有何不同 并且我阅读了我能找到的所有关于char vs char 但所有这些答案都没有告诉我们什么时候应该使用它们 所以我的问题是 你什么时候使用 const char text text 你什么时候使用 co
  • 引用计数类和多线程

    我是多线程编程的新手 对此我仍然感到困惑 下面是我的引用计数类 class Rbuffer private char m pnData volatile unsigned int mRefCount public Rbuffer int n
  • ASP.Net Core 中没有智能感知

    通过 Visual Studio 安装 ASP Net Core gt 新项目 gt Web gt ASP Net Web 应用程序 gt 确定 gt ASP Net 5 模板 安装后重新启动系统 然后创建一个新项目ASP NET 5 Te
  • Phong 着色问题

    我正在根据以下内容编写着色器冯模型 http en wikipedia org wiki Phong reflection model 我正在尝试实现这个方程 其中 n 是法线 l 是光线方向 v 是相机方向 r 是光反射 维基百科文章中更

随机推荐

  • nginx的七层和四层负载均衡

    1 负载均衡目的 将前端超高并发访问转发至后端多台服务器进行处理 解决单个节点压力过大 造成Web服务响应过慢 严重的情况下导致服务瘫痪 无法正常提供服务的问题 2 工作原理 负载均衡分为四层负载均衡和七层负载均衡 四层负载均衡是工作在七层
  • 服务器显示ip访问权限,服务器设置ip访问权限

    服务器设置ip访问权限 内容精选 换一换 若想对象可以被匿名用户 可通过以下三步完成 MindX DL为用户提供组件检查功能 用户可以通过检查脚本获取NPU驱动 Docker Kubernetes组件 Kubelet Kubectl和Kub
  • Ubuntu安装GCC5/7/9/10/11

    为了使用C 14 17 20的新特性 我们难免要升级下自己的GCC版本 同时还要保证自己新安装的GCC生效 并且和原GCC共存 安装GCC 5 0 sudo add apt repository ppa ubuntu toolchain r
  • 编程思维可以有效简化问题

    我们可能会遇到这样一些情况 例如某个孩子和同龄人相比 说话做事更有条理性 每一句都清清楚楚 在逻辑性上明显较强 这是为什么呢 格物斯坦小坦克认为这背后都是因为逻辑思维能力的差异化 逻辑思维差导致孩子处理问题的能力差 无法正确表达自己的想法
  • LaTeX的安装教程(Texlive 2020 + TeX studio)

    LaTeX 音译为 拉泰赫 是一种基于 的排版系统 由美国计算机学家莱斯利 兰伯特 Leslie Lamport 在20世纪80年代初期开发 利用这种格式 即使使用者没有排版和程序设计的知识也可以充分发挥由TeX所提供的强大功能 能在几天
  • 【python学习笔记】:几个 Python 项目构建工具

    Python 历时这么久以来至今还未有一个事实上标准的项目管理及构建工具 以至于造成 Python 项目的结构与构建方式五花八门 这或许是体现了 Python 的自由意志 不像 Java 在经历了最初的手工构建 到半自动化的 Ant 再到
  • 善于使用二阶思维

    事情往往不是你想象的那样 有时候 看似解决了问题 却在不经意间 引发了更严重的后果 帮助我们思考 决策 解决问题的最有效方法是 运用二阶思维 什么是二阶思维 一阶思维是单纯而肤浅的 几乎人人都能做到 二阶思维则是深邃 复杂而迂回的 能做到的
  • 异步调用,async await基本示例及项目中运用

    示例 async function asyncCall let a await interfaceFn console log 这里是同步 function interfaceFn return new Promise resolve re
  • Jackson中的自定义反序列化器和验证

    tl dr 将输入验证添加到Jackson中的自定义json解串器很重要 在RHQ中 我们在几个地方使用了Json解析 直接在as7 Wildfly插件中 或者通过RESTEasy 2 3 5间接在REST api中使用 已经很繁重了 现在
  • 构建高性能应用:Java与MongoDB的完美融合

    AI绘画关于SD MJ GPT SDXL百科全书 面试题分享点我直达 2023Python面试题 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java python面试题 项目实战 AI文本 OCR识别最佳实践 A
  • windows 资源管理器已停止工作的解决办法

    问题现象描述 电脑开机输入密码后 加载很久 才跳转至解锁后的界面 但解锁后的界面不显示桌面 任务管理器提示 资源管理器已停止工作 尝试联机解决方案或者关闭程序都不奏效 一些快捷键比如win r win e都不起作用 但能ctr alt de
  • vue中 Error in mounted hook: "TypeError: __WEBPACK_IMPORTED_MODULE_0__assets_swiper_js__.default is n...

    个人小站点 https sundjly github io 在vue的项目中出现了以下错误 Error in mounted hook TypeError WEBPACK IMPORTED MODULE 0 assets swiper js
  • matplotlib可视化之饼图plt.pie()与plt.legend()中bbox_to_anchor参数的理解

    函数功能 表示离散变量各占比情况 调用方法 plt pie x explode None labels None colors None autopct None pctdistance 0 6 shadow False labeldist
  • matlab 小球随机分布,matlab空间内生成随机球体,并不重叠

    根据comsol上的奶酪模型 即在三维空间内生成小孔模型 想进一步控制生成的小孔互不重叠 但是运行不出来 大神们能帮我看看错误吗 代码是循环体部分的 奶酪中的小孔初始化参数 number of hols 80 初始化并定义奶酪内的小孔总数
  • matlab读取txt文档三行数据库,matlab将数据读取和写入txt文档

    matlab中打开文件 fid fopen 文件名 打开方式 说明 fid用于存储文件句柄值 若是fid gt 0 这说明文件打开乐成 另外 在这些字符串后添加一个 t 如 rt 或 wt 则将该文件以文本方式打开 若是添加的是 b 则以二
  • adb复制root到手机,怎样通过adb命令来root手机

    实战 Androidadb常用命令详解 ADB 全称Android Debug Bridge 是一个功能非常强大的工具 它位于Android SDK安装目录的platform tools 子目录下 ADB工具即可完成模拟器文件与电脑文件的相
  • win10 服务主机:DCOM服务器进程启动器 进程导致电脑卡死解决思路

    新买的笔记本 联想拯救者Y7000 系统 win10专业版 已经禁用了网上可搜的服务 没有win10开始菜单的磁条 原因 总是在开机一段时间后系统卡死 只能强制关机才可以 查找 后来开着任务管理器 放着看到底什么原因造成的 发现 服务主机
  • Ubuntu 16.04 上 CUDA_10.0及cuDNN的安装

    GPU Geforce GTX1060 驱动版本 418 56 最开始打算装CUDA 10 1 nvidia与cuda需相匹配 但是在运行cuda run后出现的用户许可证信息有问题 如图 但是CUDA 10 1与驱动版本是相匹配的 也没有
  • 排序算法总结(长期更新)

    1 最基础的排序算法 1 冒泡排序 思想 每次使用交换的方式将剩余元素中较大的元素放到一端 直到剩余元素为0的时候排序结束 include
  • PCL读取显示点云的两种方式

    读取点云的两种方式 PCL提供了两种pcd点云读写方式 其中PCD Point Cloud Date 点云数据 对应的文件格式为 pcd 是 PCL官方指定格式 具有 ASCII 和 Binary 两种数据存储类型 其中 ASCII 格式的