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