三维人脸重建(二)——Python生成ply文件

目录

  • 引言
  • 一、ply格式模型介绍
  • 二、代码

引言

  本文主要以做坐标点为例。
  我们知道python对数据的处理主要是以numpy的形式
  一般三维空间坐标的矩阵在python中为

[[x1, y1, z1],
[x2, y2, z2],
...
...
...
[xn, yn, zn]]

  然后可以通过工具包绘制三维散点图,如下
三维人脸重建(二)——Python生成ply文件_第1张图片
  总归python只是一个数据处理工具,npy格式的数据并不能被专门的3D处理软件读取。因此我们需要将点云数据写入3D文件中,本文将介绍其中一种——ply

一、ply格式模型介绍

文件说明,有助于数据提取时的理解。这一部分借鉴3D基本知识PLY格式

参考:PLY格式介绍与读取

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

格式组成:

头:声明数据格式,规定和点和面片的数据内容

点:点的数据内容(坐标x,y,z 颜色r,g,b等)

线:线的数据内容(组成线的点序号索引,颜色等)

面片:面片的数据内容(组成面的点序号索引,颜色等)

举例:

ply                 
format ascii 1.0   
 //数据保存格式,三类
//format ascii 1.0
//format binary_little_endian 1.0
//format binary_big_endian 1.0
element vertex 8 //元素:顶点 个数为8
property float x    
property float y    
property float z    //顶点格式:依次为x,yz坐标
element edge 6  //元素:边 6条
property int vertex1
property int vertex2
property uchar red  
property uchar green
property uchar blue //边存储格式为: 顶点id 1,2,颜色r,g,b
end_header  //头,以end_header结束
0.194585 0.0202505 -0.654565
0.393574 0.0181872 -0.634588
0.196413 0.220227 -0.652125
0.174584 0.0180056 -0.455581
0.811062 -0.0294865 -0.551833
0.991697 -0.0650619 -0.473697
0.845413 0.167279 -0.541659
0.73238 -0.0252545 -0.368009  //点内容,8个顶点(x,y,z)坐标
0 1 255 0 0
0 2 0 255 0
0 3 0 0 255
4 5 255 0 0
4 6 0 255 0
4 7 0 0 255   //6条边,(id1,id2,r,g,b)

二、代码

import numpy as np
# Function to create point cloud file
def create_output(vertices, colors, filename):
    colors = colors.reshape(-1, 3)
    vertices = np.hstack([vertices.reshape(-1, 3), colors])
    np.savetxt(filename, vertices, fmt='%f %f %f %d %d %d')     # 必须先写入,然后利用write()在头部插入ply header
    ply_header = '''ply
    		format ascii 1.0
    		element vertex %(vert_num)d
    		property float x
    		property float y
    		property float z
    		property uchar red
    		property uchar green
    		property uchar blue
    		end_header
    		\n
    		'''
    with open(filename, 'r+') as f:
        old = f.read()
        f.seek(0)
        f.write(ply_header % dict(vert_num=len(vertices)))
        f.write(old)


if __name__ == '__main__':
    # Define name for output file
    output_file = 'Andre_Agassi_0015.ply'
    a = np.load("Andre_Agassi_0015.npy")
    b = np.float32(a)
#   43867是我的点云的数量,用的时候记得改成自己的
    one = np.ones((43867,3))
    one = np.float32(one)*255
#    points_3D = np.array([[1,2,3],[3,4,5]]) # 得到的3D点(x,y,z),即2个空间点
#    colors = np.array([[0, 255, 255], [0, 255, 255]])   #给每个点添加rgb
    # Generate point cloud
    print("\n Creating the output file... \n")
#    create_output(points_3D, colors, output_file)
    create_output(b, one, output_file)

  最终三维坐标就保存在ply中了
  代码中的color是每个坐标点对应的纹理色彩,可自行设置
  用meshlab打开我们生成的ply的效果如下:
  三维人脸重建(二)——Python生成ply文件_第2张图片

你可能感兴趣的:(三维重建)