PCL库中PLY文件的读取和写入操作详解
创作时间:
作者:
@小白创作中心
PCL库中PLY文件的读取和写入操作详解
引用
CSDN
1.
https://blog.csdn.net/xhm01291212/article/details/141888605
PLY文件格式简介
PLY(Polygon File Format)多边形文件格式,又被称为斯坦福三角形格式,是一种用于存储计算机多边形图形集对象的格式。它既简单易操作,又具有较高的通用性。PLY文件有两种子格式:ASCII和二进制形式。ASCII格式具有简单易操作的特点,而二进制格式则拥有读写紧凑的优势。
在PCL(Point Cloud Library)中,PLY文件可以被读取为点云数据和网格(mesh)数据两种类型。
PLY文件的读取
读取为点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ply(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPLYFile("D:/code/csdn/data/斯坦福/bunny.ply", *cloud_ply); // 读取为点云数据的格式
读取为网格数据
pcl::PolygonMesh::Ptr cloud_mesh(new pcl::PolygonMesh);
pcl::io::loadPLYFile("D:/code/csdn/data/斯坦福/bunny.ply", *cloud_mesh); // 读取为mesh数据的格式
PLY文件的保存
点云数据类型的保存
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ply(new pcl::PointCloud<pcl::PointXYZ>);
// 点云数据类型的保存
pcl::io::savePLYFile("D:/code/csdn/data/bunny_ascii.ply", *cloud_ply); // 写入ply点云文件,默认为ASCII格式
pcl::io::savePLYFileBinary("D:/code/csdn/data/bunny_bin.ply", *cloud_ply); // 写入ply点云文件,bin的二进制格式
网格数据类型的保存
pcl::PolygonMesh::Ptr cloud_mesh(new pcl::PolygonMesh);
// 模型数据类型的保存
pcl::io::savePLYFile("D:/code/csdn/data/bunny_mesh.ply", *cloud_mesh); // 写入ply模型文件,默认为ASCII格式
pcl::io::savePLYFileBinary("D:/code/csdn/data/bunny_bin.ply", *cloud_mesh); // 写入ply点云文件,bin的二进制格式
完整代码示例
#include <iostream>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#define PLY_LOAD_FUNC
int main()
{
/****************读取PLY文件********************/
pcl::PLYReader* plyReader = new pcl::PLYReader(); // ply对象
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ply(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PolygonMesh::Ptr cloud_mesh(new pcl::PolygonMesh);
#ifdef PLY_LOAD_FUNC
/****************方式一********************/
pcl::io::loadPLYFile("D:/code/csdn/data/斯坦福/bunny.ply", *cloud_ply); // 读取为点云数据的格式
pcl::io::loadPLYFile("D:/code/csdn/data/斯坦福/bunny.ply", *cloud_mesh); // 读取为mesh数据的格式
#else
/****************方式二********************/
// 读取文件头
pcl::PCLPointCloud2 cloud2_ply_header; // 结果点云数据头信息
Eigen::Vector4f origin_header; // 传感器采集原点(仅适用于>FILE_V7,如果不存在则为空)
Eigen::Quaternionf orientation_header; // 传感器采集方向(仅适用于>FILE-V7)
int file_version_header; // 文件的file版本(file_V6或file_V7)
int data_type_header; // 数据类型(二进制数据=1,ply=0等)
unsigned int data_idx_header; // 文件中点云数据的偏移量
plyReader->readHeader("D:/code/csdn/data/bunny.ply", cloud2_ply_header, origin_header, orientation_header, file_version_header, data_type_header, data_idx_header);
// 读取文件
pcl::PCLPointCloud2 cloud2_ply; // 结果点云数据
Eigen::Vector4f origin; // 传感器采集原点(仅适用于>FILE_V7,如果不存在则为空)
Eigen::Quaternionf orientation; // 传感器采集方向(仅适用于>FILE-V7)
int file_version; // 文件的file版本(file_V6或file_V7)
plyReader->read("D:/code/csdn/data/bunny.ply", cloud2_ply, origin, orientation, file_version);
pcl::fromPCLPointCloud2<pcl::PointXYZ>(cloud2_ply, *cloud_ply); // 转换为pcl::point<pointT>形式
#endif // PLY_LOAD_FUNC
/****************写入ply文件********************/
// 点云数据类型的保存
pcl::io::savePLYFile("D:/code/csdn/data/bunny_ascii.ply", *cloud_ply); // 写入ply点云文件,默认为ASCII格式
pcl::io::savePLYFileBinary("D:/code/csdn/data/bunny_bin.ply", *cloud_ply); // 写入ply点云文件,bin的二进制格式
// 模型数据类型的保存
pcl::io::savePLYFile("D:/code/csdn/data/bunny_mesh.ply", *cloud_mesh); // 写入ply模型文件,默认为ASCII格式
pcl::io::savePLYFileBinary("D:/code/csdn/data/bunny_bin.ply", *cloud_mesh); // 写入ply点云文件,bin的二进制格式
// 展示
boost::shared_ptr<pcl::visualization::PCLVisualizer> view_raw(new pcl::visualization::PCLVisualizer("raw"));
view_raw->addPointCloud(cloud_ply, "raw cloud");
view_raw->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "raw cloud");
boost::shared_ptr<pcl::visualization::PCLVisualizer> view_1(new pcl::visualization::PCLVisualizer("mesh"));
view_1->addPolygonMesh(*cloud_mesh, "mesh cloud");
view_1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "mesh cloud");
while (!view_raw->wasStopped() || !view_1->wasStopped())
{
view_raw->spinOnce(100);
view_1->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
}
结果展示
读取为点云形式
读取为模型形式
写入之后的文件
对写入之后的文件,可以直接使用Windows预览功能查看:
本文原文来自CSDN
热门推荐
广东四会下茆村:党建引领聚合力,共建家园展新颜
国产耳机的品质如何?(探索国产耳机的声音世界)
锦衣卫、东厂、西厂:明朝三大特务机构的权力角逐
钟南山建议:中老年人想健康长寿,这3种主食要多吃!
火影忍者小樱:从医疗忍者到强大战力的成长之路
普通话证书考试报名流程及注意事项
网站网页归档的八大环节详解
红小豆的功效与作用是什么?红小豆的营养价值和用途有哪些?
探索网络安全的多元维度:现状、趋势与实践
期货日内交易策略——一个以交易为生的真实向导
风水学中峦头与理气的交融
开启航天探索之旅!香港青少年赴珠海研学
七夕警示:探索社工库与网络搜索下的个人隐私泄露与保护策略
合金元素的结合赋予了M390钢极高的硬度和耐磨性
汽车冬天加热正确方法
冬天开暖风真的会增加油耗吗?这些使用技巧帮你省油又保暖
如何建立健康的友谊?
峨眉佛光:揭秘峨眉山神秘佛光现象的全攻略 🌈
短线交易的生态:策略、分析与收益的深度剖析
癸卯流年大运好是什么意思,详解各日干运势影响
描写时间过得快,别再用光阴似箭了
这才是战争第七弹|打仗就是打后勤(上)
腌咸菜的注意事项
促进肝癌细胞线粒体凋亡!广州中医药大学发文:发现肝癌治疗新机制
长期睡眠不足危害大:如何通过简单习惯改善身心健康?
MBTI测试全解析:从简介、测试版本、寻找记录方法到人格维度与局限性
如何使用加密技术确保 WebRTC 通信安全
iSCSI是什么?详解iSCSI协议及其应用场景
不愿跟人交流是心理障碍吗
《射雕英雄传之侠之大者》破5亿 差评一片?