问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号