Spaces:
Sleeping
Sleeping
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() | |