本文主要以做坐标点为例。
我们知道python对数据的处理主要是以numpy的形式
一般三维空间坐标的矩阵在python中为
[[x1, y1, z1],
[x2, y2, z2],
...
...
...
[xn, yn, zn]]
然后可以通过工具包绘制三维散点图,如下
总归python只是一个数据处理工具,npy格式的数据并不能被专门的3D处理软件读取。因此我们需要将点云数据写入3D文件中,本文将介绍其中一种——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的效果如下: