iti/HandMesh
0
1import torch2from torch_geometric.data import Data3from torch_geometric.utils import to_undirected4import openmesh as om5from os import path as osp6from utils import utils, mesh_sampling7from psbody.mesh import Mesh8import pickle9 10 11def read_mesh(path):12 mesh = om.read_trimesh(path)13 face = torch.from_numpy(mesh.face_vertex_indices()).T.type(torch.long)14 x = torch.tensor(mesh.points().astype('float32'))15 edge_index = torch.cat([face[:2], face[1:], face[::2]], dim=1)16 edge_index = to_undirected(edge_index)17 return Data(x=x, edge_index=edge_index, face=face)18 19 20def save_mesh(fp, x, f):21 om.write_mesh(fp, om.TriMesh(x, f))22 23 24def save_obj(v, f, file_name='output.obj'):25 obj_file = open(file_name, 'w')26 for i in range(len(v)):27 obj_file.write('v ' + str(v[i][0]) + ' ' + str(v[i][1]) + ' ' + str(v[i][2]) + '\n')28 for i in range(len(f)):29 obj_file.write('f ' + str(f[i][0]+1) + '/' + str(f[i][0]+1) + ' ' + str(f[i][1]+1) + '/' + str(f[i][1]+1) + ' ' + str(f[i][2]+1) + '/' + str(f[i][2]+1) + '\n')30 obj_file.close()31 32 33def spiral_tramsform(transform_fp, template_fp, ds_factors, seq_length, dilation):34 if not osp.exists(transform_fp):35 print('Generating transform matrices...')36 mesh = Mesh(filename=template_fp)37 # ds_factors = [3.5, 3.5, 3.5, 3.5]38 _, A, D, U, F, V = mesh_sampling.generate_transform_matrices(39 mesh, ds_factors)40 tmp = {41 'vertices': V,42 'face': F,43 'adj': A,44 'down_transform': D,45 'up_transform': U46 }47 48 with open(transform_fp, 'wb') as fp:49 pickle.dump(tmp, fp)50 print('Done!')51 print('Transform matrices are saved in \'{}\''.format(transform_fp))52 else:53 with open(transform_fp, 'rb') as f:54 tmp = pickle.load(f, encoding='latin1')55 56 spiral_indices_list = [57 utils.preprocess_spiral(tmp['face'][idx], seq_length[idx], tmp['vertices'][idx], dilation[idx])#.to(device)58 for idx in range(len(tmp['face']) - 1)59 ]60 61 down_transform_list = [62 utils.to_sparse(down_transform)#.to(device)63 for down_transform in tmp['down_transform']64 ]65 up_transform_list = [66 utils.to_sparse(up_transform)#.to(device)67 for up_transform in tmp['up_transform']68 ]69 70 return spiral_indices_list, down_transform_list, up_transform_list, tmp71 72 73if __name__ == '__main__':74 mesh = read_mesh('../data/FreiHAND/template/template.obj')75 save_mesh('../data/FreiHAND/template/template.obj', mesh.x.numpy(), mesh.face.numpy().T)76 