| 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() |
|
|