点云pcd保存

2023-11-21 04:40
文章标签 保存 点云 pcd

本文主要是介绍点云pcd保存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

pcl中保存点云的接口是  savePCDFileASCII、savePCDFileBinaryCompressed。

一般为了节省空间,我是用 二进制压缩模式比较多。

实现的效果如下:

 保存为 二进制

 保存为压缩二进制

实际内容如下:

文本模式

 二进制模式

 

 二进制压缩模式

实现klib的插件代码如下:

bool write_pcd(const std::string& fileName, const KArbit& cloud)
{if (auto d = a2T<PointCloudXYZPtr>(&cloud))				return io::savePCDFile(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZIPtr>(&cloud))			return io::savePCDFile(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZRGBPtr>(&cloud))			return io::savePCDFile(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZRGBAPtr>(&cloud))			return io::savePCDFile(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZLPtr>(&cloud))			return io::savePCDFile(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZRGBLPtr>(&cloud))			return io::savePCDFile(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZNormalPtr>(&cloud))		return io::savePCDFile(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZRGBNormalPtr>(&cloud))	return io::savePCDFile(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZINormalPtr>(&cloud))		return io::savePCDFile(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZLNormalPtr>(&cloud))		return io::savePCDFile(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloud2Ptr>(&cloud))				return io::savePCDFile(fileName, *(*d)) >= 0;return false;
}bool write_pcd_binary(const std::string & fileName, const KArbit &cloud)
{if (auto d = a2T<PointCloudXYZPtr>(&cloud))				return io::savePCDFile(fileName, *(*d), true) >= 0;if (auto d = a2T<PointCloudXYZIPtr>(&cloud))			return io::savePCDFile(fileName, *(*d), true) >= 0;if (auto d = a2T<PointCloudXYZRGBPtr>(&cloud))			return io::savePCDFile(fileName, *(*d), true) >= 0;if (auto d = a2T<PointCloudXYZRGBAPtr>(&cloud))			return io::savePCDFile(fileName, *(*d), true) >= 0;if (auto d = a2T<PointCloudXYZLPtr>(&cloud))			return io::savePCDFile(fileName, *(*d), true) >= 0;if (auto d = a2T<PointCloudXYZRGBLPtr>(&cloud))			return io::savePCDFile(fileName, *(*d), true) >= 0;if (auto d = a2T<PointCloudXYZNormalPtr>(&cloud))		return io::savePCDFile(fileName, *(*d), true) >= 0;if (auto d = a2T<PointCloudXYZRGBNormalPtr>(&cloud))	return io::savePCDFile(fileName, *(*d), true) >= 0;if (auto d = a2T<PointCloudXYZINormalPtr>(&cloud))		return io::savePCDFile(fileName, *(*d), true) >= 0;if (auto d = a2T<PointCloudXYZLNormalPtr>(&cloud))		return io::savePCDFile(fileName, *(*d), true) >= 0;if (auto d = a2T<PointCloud2Ptr>(&cloud))				return pcl::PCDWriter().writeBinary(fileName, *(*d)) >= 0;return false;
}bool write_pcd_binary_compressed(const std::string & fileName, const KArbit &cloud)
{if (auto d = a2T<PointCloudXYZPtr>(&cloud))				return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZIPtr>(&cloud))			return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZRGBPtr>(&cloud))			return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZRGBAPtr>(&cloud))			return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZLPtr>(&cloud))			return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZRGBLPtr>(&cloud))			return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZNormalPtr>(&cloud))		return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZRGBNormalPtr>(&cloud))	return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZINormalPtr>(&cloud))		return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloudXYZLNormalPtr>(&cloud))		return io::savePCDFileBinaryCompressed(fileName, *(*d)) >= 0;if (auto d = a2T<PointCloud2Ptr>(&cloud))				return pcl::PCDWriter().writeBinaryCompressed(fileName, *(*d)) >= 0;return false;
}struct KPclOutCldPcd : KPlugBase
{bool skipEmpty = true;string saveType = "pcd_binary_compressed";KPclOutCldPcd(){addProp("modelFile").setType(PropTypeSaveFile).setFileFilter("(*.pcd);;(*.*)").setEmptyIndex(1);addProp("saveType").setType(PropTypeSelect).setValueAddr(&saveType).setItems({ "pcd","pcd_binary","pcd_binary_compressed" });addProp("skipEmpty").setType(PropTypeBool).setValueAddr(&skipEmpty);}int __exec(const KArbit& src, KArbit& dst) override{auto& aL = a2list(src);auto& cld =  aL[0];CastType(fName, string, aL[1]);if (!skipEmpty && cld.empty())return false;if (saveType == "pcd")write_pcd(fName, cld);else if (saveType == "pcd_binary")write_pcd_binary(fName, cld);elsewrite_pcd_binary_compressed(fName, cld);arbit_set_value(dst, fName);return true;}
};

这篇关于点云pcd保存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/399867

相关文章

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

下载/保存/读取 文件,并转成流输出

最近对文件的操作又熟悉了下;现在记载下来:学习在于 坚持!!!不以细小而不为。 实现的是:文件的下载、文件的保存到SD卡、文件的读取输出String 类型、最后是文件转换成流输出;一整套够用了; 重点: 1:   操作网络要记得开线程; 2:更新网络获取的数据 切记用Handler机制; 3:注意代码的可读性(这里面只是保存到SD卡,在项目中切记要对SD卡的有无做判断,然后再获取路径!)

FFmpeg系列-视频解码后保存帧图片为ppm

在正常开发中遇到花屏时怎么处理呢?可以把解码后的数据直接保存成帧图片保存起来,然后直接看图片有没有花屏来排除是否是显示的问题,如果花屏,则代表显示无问题,如果图片中没有花屏,则可以往显示的方向去排查了。 void saveFrame(AVFrame* pFrame, int width, int height, int iFrame){FILE *pFile;char szFilename[

【LVI-SAM】激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节

激光雷达点云处理特征提取LIO-SAM 之FeatureExtraction实现细节 1. 特征提取实现过程总结1.0 特征提取过程小结1.1 类 `FeatureExtraction` 的整体结构与作用1.2 详细特征提取的过程1. 平滑度计算(`calculateSmoothness()`)2. 标记遮挡点(`markOccludedPoints()`)3. 特征提取(`extractF

html记账本改写:数据重新布局,更好用了,没有localStorage保存版本

<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>htm记账本</title><style>table {user-select: none;/* width: 100%; */border-collapse: collapse;}table,th,td {border: 1px solid bla

在项目中,控制权限保存时,如果多次修改权限,该如何写?

在项目中,控制权限保存时,如果多次修改权限,该如何写? 错误代码: package cn.itcast.crm.service.impl;import java.util.List;import javax.annotation.Resource;import org.apache.commons.lang.xwork.StringUtils;import org.springfr

点云数据常见的坐标系有哪些,如何进行转换?

文章目录 一、点云坐标系分类1. 世界坐标系2. 相机坐标系3. 极坐标系4. 笛卡尔坐标系(直角坐标系):5. 传感器坐标系6. 地理坐标系 二、坐标系转换方法1. 地理坐标系与投影坐标系之间的转换2. 投影坐标系与局部坐标系之间的转换3. 局部坐标系与3D模型坐标系之间的转换4. 相机坐标系与其他坐标系之间的转换5. 传感器坐标系与其他坐标系之间的转换 三、坐标系转换工具 一

三维激光扫描点云配准外业棋盘的布设与棋盘坐标测量

文章目录 一、棋盘标定板准备二、棋盘标定板布设三、棋盘标定板坐标测量 一、棋盘标定板准备 三维激光扫描棋盘是用来校准和校正激光扫描仪的重要工具,主要用于提高扫描精度。棋盘标定板通常具有以下特点: 高对比度图案:通常是黑白相间的棋盘格,便于识别。已知尺寸:每个格子的尺寸是已知的,可以用于计算比例和调整。平面标定:帮助校准相机和激光扫描仪之间的位置关系。 使用方法 扫描棋盘:

基于opencv实现双目立体匹配点云距离

双目相机或两个单目相机。 一、相机标定 MATLAB软件,打开双目标定app。 点击add images,弹出加载图像的窗口,分别导入左图和右图,设置黑白格长度(标定板的长度一般为20)。 点击确定,弹出加载好的图像。 在菜单栏勾选2 Coefficients(鱼眼相机勾选3 Coefficients)、Tangential Distinction,点击Calibrate,显示

erlang学习:用ETS和DETS存储数据3,保存元组到磁盘

学习内容 ETS表把元组保存在内存里,而DETS提供了把Erlang元组保存到磁盘上的方法。DETS的最大文件大小是2GB。DETS文件必须先打开才能使用,用完后还应该正确关闭。如果没有正确关闭,它们就会在下次打开时自动进行修复。因为修复可能会花很长一段时间,所以先正确关闭它们再结束程序是很重要的。 DETS表有着和ETS表不同的共享属性。DETS表在打开时必须赋予一个全局名称。如果两个或更多