PLY文件格式及其MATLAB读写操作

2023-10-28

     PLY是一种电脑档案格式,全名为多边形档案(Polygon File Format)或 斯坦福三角形档案(Stanford Triangle Format)。 



    史丹佛大学的 The Digital Michelangelo Project计划采用PLY格式储存极高分辨率之米开朗基罗的作品"大卫"雕塑。



   该格式主要用以储存立体扫描结果的三维数值,透过多边形片面的集合描述三维物体,与其他格式相较之下这是较为简单的方法。它可以储存的资讯包含颜色、透明度、表面法向量、材质座标与资料可信度,并能对多边形的正反两面设定不同的属性。



   在档案内容的储存上PLY有两种版本,分别是纯文字(ASCII)版本与二元码(binary)版本,其差异在储存时是否以ASCII编码表示元素资讯。

档案格式

(本文并未提供完整的格式描述,以下仅介绍PLY的基本概念与格式)

每个PLY档都包含档头(header),用以设定网格模型的“元素”与“属性”,以及在档头下方接着一连串的元素“数值资料”。一般而言,网格模型的“元素”就是顶点(vertices)、面(faces),另外还可能包含有边(edges)、深度图样本(samples of range maps)与三角带(triangle strips)等元素。无论是纯文字与二元码的PLY档,档头资讯都是以ASCII编码编写,接续其后的数值资料才有编码之分。PLY档案以此行:

?

ply

开头作为PLY格式的识别。接着第二行是版本资讯,目前有三种写法:

?

format ascii 1.0

format binary_little_endian 1.0

format binary_big_endian 1.0

其中ascii, binary_little_endian, binary_big_endian是档案储存的编码方式,而1.0是遵循的标准版本(现阶段仅有PLY 1.0版)。在档头中可使用’comment’作为一行的开头以编写注解,例如:

?

comment Thisisa comment!

描述元素及属性,必须使用’element’及’property’的关键字,一般的格式为element下方接着属性列表,例如:

?

element

property

property

property

‘property’不仅定义了资料的型态,其出现顺序亦定义了资料的顺序。内定的资料形态有两种写法:一种是char uchar short ushort int uint float double,另外一种是具有位元长度的int8 uint8 int16 uint16 int32 uint32 float32 float64。 例如,描述一个包含12个顶点的物体,每个顶点使用3个单精度浮点数 (x,y,z)代表点的座标,使用3个unsigned char代表顶点颜色,颜色顺序为 (B, G, R),则档头的写法为:

?

element vertex 12

propertyfloatx

propertyfloaty

propertyfloatz

property uchar blue

property uchar green

property uchar red

其中vertex是内定的元素类型,接续的6行property描述构成vertex元素的数值字段顺序代表的意义,及其资料形态。

另一个常使用的元素是面。由于一个面是由3个以上的顶点所组成,因此使用一个“顶点列表”即可描述一个面, PLY格式使用一个特殊关键字’property list’定义之。 例如,一个具有10个面的物体,其PLY档头可能包含:

?

element face 10

property list ucharintvertex_indices

‘property list’表示该元素face的特性是由一行的顶点列表来描述。列表开头以uchar型态的数值表示列表的项目数,后面接着资料型态为int的顶点索引值(vertex_indices),顶点索引值从0开始。

最后,标头必须以此行结尾:

?

end_header

档头后接着的是元素资料(端点座标、拓朴连结等)。在ASCII格式中各个端点与面的资讯都是以独立的一行描述,而二元编码格式则连续储存这些资料,加载时须以’element’定义的元素数目以及’property’中设定的资料形态计算各笔字段的长度。

范例

一个典型的PLY档案结构分成三部分:

?

档头 (从ply开始到end_header)

顶点元素列表

面元素列表

其中的顶点元素列表一般以x y z方式排列,形态如档头所定义;而面元素列表是以下列格式表示。

?

<組成面的端點數N> <端點#1的索引> <端點#2的索引> … <端點#N的索引>

例如画出一个有4个顶点,4个面的四面体,档案内容为:

?

ply

format ascii 1.0

comment這是一個正四面體

element vertex 4

propertyfloatx

propertyfloaty

propertyfloatz

element face 4

property list ucharintvertex_index

end_header

0 3 0

2.449 -1.0 -1.414

0 -1 2.828

-2.449 -1.0 -1.414

3 0 1 3

3 0 2 1

3 0 3 2

3 1 2 3

其中1~10行是档头, 11~14行是顶点元素列表, 15~18行则是面元素列表。

其中: 0 3 0是顶点

历史

PLY格式发展于90年代中期,在史丹佛大学图学实验室的Marc Levoy教授指导下,由Greg Turk及其他成员开发出来。PLY格式受Wavefront .obj格式的启发,但改进了Obj格式所缺少的对任意属性及群组的扩充性。因此PLY格式发明了”property”及”element”这两个关键词,来概括“顶点、面、相关资讯、群组”的概念。

注意

ply文件不支持中文格式的文件名字,所以在使用过程中避免使用中文来命名。

使用MATLAB对PLY文件进行读操作

function [ Elements, varargout ] = PLY_READ ( Path, Str )

%*****************************************************************************80
%
%% PLY_READ reads a PLY 3D data file.
%
%   [DATA,COMMENTS] = PLY_READ(FILENAME) reads a version 1.0 PLY file
%   FILENAME and returns a structure DATA.  The fields in this structure
%   are defined by the PLY header; each element type is a field and each
%   element property is a subfield.  If the file contains any comments,
%   they are returned in a cell string array COMMENTS.
%
%   [TRI,PTS] = PLY_READ(FILENAME,'tri') or
%   [TRI,PTS,DATA,COMMENTS] = PLY_READ(FILENAME,'tri') converts vertex
%   and face data into triangular connectivity and vertex arrays.  The
%   mesh can then be displayed using the TRISURF command.
%
%   Note: This function is slow for large mesh files (+50K faces),
%   especially when reading data with list type properties.
%
%   Example:
%   [Tri,Pts] = PLY_READ('cow.ply','tri');
%   [Tri,Pts] = PLY_READ('bunny.ply','tri');
%   trisurf(Tri,Pts(:,1),Pts(:,2),Pts(:,3));
%   colormap(gray); axis equal;
%
%  Discussion:
%
%    The original version of this program had a mistake that meant it
%    did not properly triangulate files whose faces were not already triangular.
%    This has been corrected (JVB, 25 February 2007).
%
%    Glenn Ramsey pointed out and corrected a problem that occurred
%    with an uninitialized value of Type2, 27 August 2012.
%
%  Licensing:
%
%    This code is distributed under the GNU LGPL license.
%
%  Modified:
%
%    27 August 2012
%
%  Author:
%
%    Pascal Getreuer 2004
%
%  Parameters:
%
%  Local Parameters:
%
%    COMMENTS, any comments from the file.
%
%    ELEMENTCOUNT, the number of each type of element in file.
%
%    ELEMENTS, the element data.
%
%    PROPERTYTYPES, the element property types.
%
%    SIZEOF, size in bytes of each type.
%

%
%  Open the input file in "read text" mode.
%
  [ fid, Msg ] = fopen ( Path, 'rt' );

  if ( fid == -1 )
    error ( Msg );
  end

  Buf = fscanf ( fid, '%s', 1 );

  if ( ~strcmp ( Buf, 'ply' ) )
    fclose ( fid );
    error('Not a PLY file.');
  end
%
%  Read the header.
%
  Position = ftell(fid);
  Format = '';
  NumComments = 0;
  Comments = {};
  NumElements = 0;
  NumProperties = 0;
  Elements = [];
  ElementCount = [];
  PropertyTypes = [];
  ElementNames = {};  % list of element names in the order they are stored in the file
  PropertyNames = [];  % structure of lists of property names

  while ( 1 )
%
%  Read a line from the file.
%
    Buf = fgetl ( fid );
    BufRem = Buf;
    Token = {};
    Count = 0;
%
%  Split the line into tokens.
%
    while ( ~isempty(BufRem) )

      [ tmp, BufRem ] = strtok(BufRem);
%
%  Count the tokens.
%
      if ( ~isempty ( tmp ) )
        Count = Count + 1;
        Token{Count} = tmp;
      end

    end
%
%  Parse the line.
%
    if ( Count )

      switch lower ( Token{
   1} )
%
%  Read the data format.
%
      case 'format'

        if ( 2 <= Count )

          Format = lower ( Token{
   2} );

          if ( Count == 3 & ~strcmp ( Token{
   3}, '1.0' ) )
            fclose ( fid );
            error('Only PLY format version 1.0 supported.');
          end
        end
%
%  Read a comment.
%
      case 'comment'

        NumComments = NumComments + 1;
        Comments{NumComments} = '';
        for i = 2 : Count
          Comments{NumComments} = [Comments{NumComments},Token{i},' '];
        end
%
%  Read an element name.
%
      case 'element'

        if ( 3 <= Count )

          if ( isfield(Elements,Token{
   2}) )
            fclose ( fid );
            error(['Duplicate element name, ''',Token{
   2},'''.']);
          end

          NumElements = NumElements + 1;
          NumProperties = 0;
          Elements = setfield(Elements,Token{
   2},[]);
          PropertyTypes = setfield(PropertyTypes,Token{
   2},[]);
          ElementNames{NumElements} = Token{
   2};
          PropertyNames = setfield(PropertyNames,Token{
   2},{});
          CurElement = Token{
   2};
          ElementCount(NumElements) = str2double(Token{
   3});

          if ( isnan(ElementCount(NumElements)) )
            fclose ( fid );
            error(['Bad element definition: ',Buf]);
          end

        else

          error(['Bad element definition: ',Buf]);

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

PLY文件格式及其MATLAB读写操作 的相关文章

  • 【模拟集成电路】电荷泵(CP)设计

    电荷泵 CP 设计 前言 一 电荷泵 CP 原理 1 电流失配问题 2 开关管的时钟馈通问题 3 电荷注入问题 二 电荷泵 CP 电路 三 电荷泵性能测试 测试原理图 充电测试 放电测试 参考文献 各部分链接链接 前言 本文主要内容是对电荷
  • tensorflow导入错误“ImportError: DLL load failed”(已解决)

    毕业论文需要用到tensorflow 然鹅我却卡在了安装 由于各种问题还自身的拖延症与它 斗争 了一周 终于安装成功了 我一定要记录下来这血泪史 这篇笔记也拖了好几天 如果你也遇到下面的问题 就继续往下看吧 直接 pip install t
  • Python每日练习题以及答案解析,还不进来测试一下?

    问题引入 现在有5个小朋友要分糖果 他们按照自己的编号顺序围坐在一张圆桌旁边 他们身上都有一些糖果 通过输入来决定每个小孩糖果的数量 从1号小朋友开始 将自己的糖果平均分成最多的3份 多出来的自己吃掉 自己留一份 其余两份分给他相邻的两位小
  • 【学习笔记】模糊控制算法

    本文目录 0 前言 1 概述 2 模糊集合 2 1 集合和论域 2 2 模糊集合的概念 2 3 模糊集合的表示方式 2 4 模糊集合的运算 3 模糊关系与模糊关系合成 3 1 笛卡尔积 3 2 关系与模糊关系 3 3 模糊关系的运算 3 4
  • Hadoop的伪分布式运行模式

    Hadoop运行模式包括 本地模式 伪分布式模式 以及完全分布式模式 1 本地模式 安装简单 在一台机器上运行服务 几乎不用做任何配置 但仅限于调试用途 没有分布式文件系统 直接读写本地操作系统的文件系统 2 伪分布式模式 在单节点上同时启
  • java学习笔记13--反射机制与动态代理

    本文地址 http www cnblogs com archimedes p java study note13 html 转载请注明源地址 Java的反射机制 在Java运行时环境中 对于任意一个类 能否知道这个类有哪些属性和方法 对于任
  • 解决SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]的方案!!!!!

    目录 前提 一 安装maven helper插件 1 安装 2 安装成功 3 使用 二 去掉冲突的依赖包 1 前面已找到目标依赖 去pom文件内操作 2 去除 3 最后就可以了 前提 今天单元测试遇到了jar包冲突 SLF4J Class
  • 布隆过滤器(Bloom Filter)

    1 引言 通常我们会遇到很多要判断一个元素是否在某个集合中的业务场景 一般想到的是将集合中所有元素保存起来 然后通过比较确定 链表 树 散列表 又叫哈希表 Hash table 等等数据结构都是这种思路 但是随着集合中元素的增加 我们需要的
  • 【模拟CMOS集成电路设计】带隙基准(Bandgap)设计与仿真

    模拟CMOS集成电路设计 带隙基准 Bandgap 设计与仿真 前言 一 设计指标 二 电路分析 三 仿真测试 3 1测试电路图 3 2测试结果 1 基准温度系数仿真 2 瞬态启动仿真 3 静态电流仿真 4 线性调整率仿真 5 电源抑制PS
  • java I/O流的一些常用操作

    java i o 的一些操作 文件流 FileInputStream FileOutputStream FileReader FileWriter 这四个类是专门操作文件流的 用法高度相似 区别在于前面两个是操作字节流 后面两个是操作字符流
  • 学习笔记-Spark环境搭建与使用

    一 20 04 Ubuntu安装 清华源ISO源 https mirrors tuna tsinghua edu cn ubuntu releases 20 04 下载链接 https mirrors tuna tsinghua edu c
  • python的文件操作

    一 文件的基本操作 1 读文件read f open filename r encoding utf 8 data f read 读文件 f close 关闭文件 1 绝对路径的易错点 文件路径中 前要加转义字符 或者 使用r使转义字符失效
  • CentOS 7 挂载本地光盘作为镜像源

    1 上传iso文件到 usr local src 一定要确保这个ISO文件上传完毕后再进行下面的操作 2 创建挂载目录 mkdir media CentOS7 3 挂载iso文件 mount t iso9660 o loop usr loc
  • 《Web应用安全权威指南》学习笔记

    第1章 什么是Web应用的安全隐患 第2章 搭建试验环境 邮件发送服务器Postfix POP3服务器Dovecot SSH服务器OpenSSH Web应用调试工具Fiddler 第3章 Web安全基础 HTTP回话管理 同源策略 Cook
  • LeetCode题目笔记——17.19消失的两个数字

    文章目录 题目描述 题目难度 困难 方法一 暴力 代码 代码优化 方法二 数学方法 代码 总结 题目描述 题目直达 题目难度 困难 方法一 暴力 虽然题目说你能在 O N 时间内只用 O 1 的空间找到它们吗 但是也没有限制我们不能用暴力
  • MyBatis学习笔记整理详细

    MyBatis笔记 写在前面 欢迎来到 发奋的小张 的博客 我是小张 一名普通的在校大学生 在学习之余 用博客来记录我学习过程中的点点滴滴 也希望我的博客能够更给同样热爱学习热爱技术的你们带来收获 希望大家多多关照 我们一起成长一起进步 也
  • [足式机器人]Part2 Dr. CAN学习笔记-Ch0-1矩阵的导数运算

    本文仅供学习使用 本文参考 B站 DR CAN Dr CAN学习笔记 Ch0 1矩阵的导数运算 1 标量向量方程对向量求导 分母布局 分子布局 1 1 标量方程对向量的导数 1 2 向量方程对向量的导数 2 案例分析 线性回归 3 矩阵求导
  • Linux shell编程学习笔记32:declare 命令

    0 前言 在 Linux shell编程学习笔记16 bash中的关联数组 https blog csdn net Purpleendurer article details 134053506 spm 1001 2014 3001 550
  • 六个优质开源项目,让你更了解Django框架开发

    Django 是一个开源的 Web 应用框架 由 Python 写成 采用了 MTV 的框架模式 即模型 M 视图 V 和模版 T 它最初是被用来开发 CMS 软件的 所以 Django 很适合用来搭建内容类网站 它的设计目的是使常见的 W
  • 监控显卡显存(python代码)

    一 前言 我和我同学的代码 分别占用14G显存 而显卡的显存只有24G 没有办法同时跑 所以 他先跑 我的代码时刻监控显存的使用情况 只要显卡显存大于14G 我的代码就自动启动 二 代码 import pynvml import time

随机推荐

  • 电商平台用户消费行为分析

    CD案例分析 本文对CD案例进行了一个分析总结 主要是根据用户消费记录 分析用户消费行为 统计电商领域的一些关键性指标 项目背景 CDNOW 是一个主打线上销售的CD品牌 通过 1 5年 的用户消费记录 针对这1 5年时间里的销售数据对用户
  • python之路 第八章 python异常、模块与包——了解异常、异常的捕获方法、异常的传递性、python模块、python包

    目录 第八章 python异常 模块与包 01 了解异常 02 异常的捕获方法 为什么我们要去捕获异常 如何捕获异常 03 异常的传递性 04 Python模块 什么是模块 模块的导入 自定义模块 05 Python包 什么是Python包
  • 教女朋友如何还原数据库?

    第一步右击选择要还原的数据库如下图 第二步选择数据库备份文件 如下图 出现选择文件的对话框如下 第三步选择 强制还原 如下图 最后点击确定 就可还原数据库 注意 对一下选项菜单中的被还原的数据库的物理路径是否正确 很多还原失败就是被还原的数
  • Linux笔记,全网最详细!!!(14)

    文章目录 第一章 Linux介绍 1 1 Linux是什么 1 2 Linux主要的发行版本 第二章 Linux的安装 2 1下载软件 2 1 1 虚拟机软件下载 2 1 2 CentOS下载 2 2 安装虚拟机 2 2 1 虚拟机介绍 2
  • 网络编程入门

    网络编程 网络介绍 网络设备 互联网是什么 IP 端口 传输控制协议 TCP UDP URL 单工 半双工 全双工 综合练习即时聊天系统 网络简介 网络设备 要组成一个局域网 必须要有路由器 每一个连接到路由器上的设备必须有网卡 每一个网卡
  • 离线安装大全

    tar打包解压 离线 打包文件夹 test 命名为test tar tar cvf test tar test 离线 解包文件夹 tar xvf test tar 离线安装yum包 在线 安装yum下载工具 yum install yum
  • 面向对象类设计7大技巧(如果已具备证明已是高级水平了)

    1 一定要保证数据私有 这是最重要的 绝对不要破坏封装性 有时候需要 编写一个访问器方法或更改器 但是嘴还还是保持实例的私有性 很多经验告诉我们 数据的表示形式很可能会改变 但他们的使用方式却不会经常发生改变 当数据保持私有时 它们的表示形
  • 理解智能合约

    链客 专为开发者而生 有问必答 此文章来自区块链技术社区 未经允许拒绝转载 0x00 前言 理解智能合约对理解区块链技术至关重要 我们先来看下什么是智能合约 智能合约是 1990s 年代由尼克萨博提出的理念 几乎与互联网同龄 由于缺少可信的
  • 用Rust实现23种设计模式之 模板方法模式

    关注我 学习Rust不迷路 模板方法模式是一种行为型设计模式 它定义了一个算法的骨架 将一些步骤的实现延迟到子类中 以下是模板方法模式的优点和使用场景 优点 提高代码复用性 模板方法模式通过将算法的通用部分放在父类中 可以在子类中复用这些通
  • 测试用例的设计方法及案例

    测试用例的设计方法 一 软件测试的生命周期 软件测试的流程是什么 二 如何描述一个BUG 三 测试用例的设计方法 3 1等价类 3 2边界值法 3 3因果图法 3 4场景设计法 3 5正交排列法 3 6错误猜测法 一 软件测试的生命周期 软
  • Microsoft Dynamics产品梳理

    目录 前言 一 Dynamics 365 Sales Customer Service Field Service Finance Operations 二 Dynamics GP Great Plains 三 Dynamics NAV N
  • Python3 goto 语句的使用

    熟悉 C 语言的小伙伴一定对 goto 语句不陌生 它可以在代码之间随意的跳来跳去 但是好多老鸟都告诫大家 不要使用 goto 因为 goto 会使你的代码逻辑变的极其混乱 但是有时候我们不得不用它 因为它太高效了 比如进入循环内部深层一个
  • 学生管理系统C语言

    include
  • Win10 隐藏远程桌面,连接栏

    https www cnblogs com tuhong p 13307579 html 快捷键 Ctrl Alt Home
  • Django 省、市、区 三级联动 及数据库的地址添加 !!!

    应用场景 淘宝 京东 等需要地址的地方 Models py模型 from django db import models Create your models here class Area models Model name models
  • Redis可视化工具RedisInsight

    今天是老苏居家隔离的第 39 天 周五抗原 周六 周日 周一每天两次抗原 上午一次 下午一次 没完没了的捅鼻子 感觉都要捅出鼻炎了 虽然小区早就是防范区了 但是一直处于提级管理中 还是不能出小区 也看不到任何松动的迹象 最近几天都在传 一人
  • R reason ‘拒绝访问‘的解决方案

    Win11系统 安装rms的时候报错 Error in loadNamespace j lt i 1L c lib loc libPaths versionCheck vI j namespace Matrix 1 5 4 1 is alr
  • 使用Thinkphp5.0 中 {include file="index/left" /} 引入模板 影响样式

    在使用Thinkphp 5 0框架开发后台的时候 需要在模板中引用公共头部 我使用 include file index header 的方式引用了公共头部 引用之后发现头部和页面顶端之间出现了间距 未引用之前 头部和页面顶端是没有间距的
  • Azure文件同步服务的创建和配置

    将Azure FileShare share1同步到Server Endpoint 在这没法添加 只能管理服务 选择 Create a resource 查找 azure file sync 注意 选择的Location 一定要与File服
  • PLY文件格式及其MATLAB读写操作

    PLY是一种电脑档案格式 全名为多边形档案 Polygon File Format 或 斯坦福三角形档案 Stanford Triangle Format 史丹佛大学的 The Digital Michelangelo Project计划采