(img, body_model_param, body_model, camera, return_mask=False)
| 27 | # smplx_shape = smplx_shape_except_expression |
| 28 | |
| 29 | def render_pose(img, body_model_param, body_model, camera, return_mask=False): |
| 30 | |
| 31 | # the inverse is same |
| 32 | pyrender2opencv = np.array([[1.0, 0, 0, 0], |
| 33 | [0, -1, 0, 0], |
| 34 | [0, 0, -1, 0], |
| 35 | [0, 0, 0, 1]]) |
| 36 | |
| 37 | output = body_model(**body_model_param, return_verts=True) |
| 38 | |
| 39 | vertices = output['vertices'].detach().cpu().numpy().squeeze() |
| 40 | faces = body_model.faces |
| 41 | |
| 42 | # render material |
| 43 | base_color = (1.0, 193/255, 193/255, 1.0) |
| 44 | material = pyrender.MetallicRoughnessMaterial( |
| 45 | metallicFactor=0, |
| 46 | alphaMode='OPAQUE', |
| 47 | baseColorFactor=base_color) |
| 48 | |
| 49 | material_new = pyrender.MetallicRoughnessMaterial( |
| 50 | metallicFactor=0.1, |
| 51 | roughnessFactor=0.4, |
| 52 | alphaMode='OPAQUE', |
| 53 | emissiveFactor=(0.2, 0.2, 0.2), |
| 54 | baseColorFactor=(0.7, 0.7, 0.7, 1)) |
| 55 | material = material_new |
| 56 | |
| 57 | # get body mesh |
| 58 | body_trimesh = trimesh.Trimesh(vertices, faces, process=False) |
| 59 | body_mesh = pyrender.Mesh.from_trimesh(body_trimesh, material=material) |
| 60 | |
| 61 | # prepare camera and light |
| 62 | light = pyrender.DirectionalLight(color=np.ones(3), intensity=2.0) |
| 63 | cam_pose = pyrender2opencv @ np.eye(4) |
| 64 | |
| 65 | # build scene |
| 66 | scene = pyrender.Scene(bg_color=[0.0, 0.0, 0.0, 0.0], |
| 67 | ambient_light=(0.3, 0.3, 0.3)) |
| 68 | scene.add(camera, pose=cam_pose) |
| 69 | scene.add(light, pose=cam_pose) |
| 70 | scene.add(body_mesh, 'mesh') |
| 71 | |
| 72 | # render scene |
| 73 | os.environ["PYOPENGL_PLATFORM"] = "osmesa" # include this line if use in vscode |
| 74 | r = pyrender.OffscreenRenderer(viewport_width=img.shape[1], |
| 75 | viewport_height=img.shape[0], |
| 76 | point_size=1.0) |
| 77 | |
| 78 | color, _ = r.render(scene, flags=pyrender.RenderFlags.RGBA) |
| 79 | color = color.astype(np.float32) / 255.0 |
| 80 | # alpha = 1.0 # set transparency in [0.0, 1.0] |
| 81 | # color[:, :, -1] = color[:, :, -1] * alpha |
| 82 | valid_mask = (color[:, :, -1] > 0)[:, :, np.newaxis] |
| 83 | img = img / 255 |
| 84 | # output_img = (color[:, :, :-1] * valid_mask + (1 - valid_mask) * img) |
| 85 | color = cv2.cvtColor(color, cv2.COLOR_BGR2RGB) |
| 86 | output_img = (color[:, :, :] * valid_mask + (1 - valid_mask) * img) |
no outgoing calls
no test coverage detected