记录点云操作的时候发生的事情
最近在用SHREC14和13 的数据集,原始数据集的三维模型为OFF格式,为了转为点云走了一些弯路
接下来记录一下最终的代码。
`
STL,PLY,OFF格式相互转换
路径中不能有中文
import open3d as o3d
mesh = o3d.io.read_triangle_mesh("xx.off") #读取.off文件,stl
o3d.io.write_triangle_mesh("xx.ply",mesh) #存储新格式,stl,ply
'''OFF转PLY'''
import trimesh
def to_ply(input_path, output_path, original_type):
mesh = trimesh.load(input_path, file_type=original_type) # read file
mesh.export(output_path, file_type='ply') # convert to ply
to_ply('D:\\SHREC14/3D/M000003.off', 'D:\\SHREC14/test.ply', 'off')
'''读取PLY并保存txt'''
def read_ply_cloud(filename):
ply_data = PlyData.read(filename)
points = ply_data['vertex'].data.copy()
print(points.shape)
cloud = np.empty([6513005, 3])
for i in range(len(points)):
point = points[i]
p = np.array([point[0], point[1], point[2]])
cloud[i] = p
return np.array(cloud)
out_arr = read_ply_cloud('D:\点云三维检索\SHREC14/test.ply')
批量操作的方法
import numpy as np
from plyfile import PlyData
import open3d
import os
old_names = os.listdir('D:\\SHREC14/OFF')
for old_name in old_names: # 遍历列表下的文件名
input_path='D:\\SHREC14/OFF/'+old_name
file_name, extension = os.path.splitext(old_name)
s1 = file_name[-6:]
print(s1)
output_path='D:\\SHREC14\PLY/'+file_name+'.ply'
to_ply(input_path, output_path, 'off')
ply_data = PlyData.read(output_path)
points = ply_data['vertex'].data.copy()
cloud = []
for i in range(len(points)):
point = points[i]
p = np.array([point[0], point[1], point[2]])
cloud.append(p)
a=np.array(cloud)
b=a.shape[0]
if b>2055:#因为有的模型转化成的点云数量太少了
np.savetxt(r'D:\\SHREC14\TXT/'+file_name+'.txt', a, fmt='%d')
诸君共勉!