import os import argparse import numpy as np from scripts.hybrik_loc2rot import HybrIKJointsToRotmat from scripts.pyrender import SMPLRender import cv2 from scipy.spatial.transform import Rotation as RRR parser = argparse.ArgumentParser( description='Render a SMPL video by a j3ds npy file.') parser.add_argument('--input', type=str, default='', help='the npy file path') parser.add_argument('--render', type=int, default=1, help='render the video if 1') args = parser.parse_args() input_path = args.input output_npy_path = args.input.replace('.npy', '_pose.npy') data = np.load(input_path) data = data - data[0, 0] pose_generator = HybrIKJointsToRotmat() pose = pose_generator(data) pose = np.concatenate( [pose, np.stack([np.stack([np.eye(3)] * pose.shape[0], 0)] * 2, 1)], 1) np.save(output_npy_path, pose) shape = [768, 768] if args.render: render = SMPLRender() output_mp4_path = args.input.replace('.npy', '_smpl.mp4') os.environ['PYOPENGL_PLATFORM'] = 'egl' size = (shape[1], shape[0]) fps = 30.0 fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V') videoWriter = cv2.VideoWriter(output_mp4_path, fourcc, fps, size) r = RRR.from_rotvec(np.array([np.pi, 0.0, 0.0])) pose[:, 0] = np.matmul(r.as_matrix().reshape(1, 3, 3), pose[:, 0]) for i in range(data.shape[0]): img = np.zeros([shape[0], shape[1], 3]) aroot = data[[i], 0] + np.array([[0.0, 0.0, 30.0]]) aroot[:, 1] = -aroot[:, 1] params = dict(pred_shape=np.zeros([1, 10]), pred_root=aroot, pred_pose=pose[[i]]) renderImg = render.render(img.copy(), params) renderImg = (renderImg * 255).astype(np.uint8) videoWriter.write(renderImg) videoWriter.release()