(img, mesh, face, cam_param)
| 148 | return joint_proj |
| 149 | |
| 150 | def render(img, mesh, face, cam_param): |
| 151 | # mesh |
| 152 | mesh = trimesh.Trimesh(mesh, face) |
| 153 | rot = trimesh.transformations.rotation_matrix( |
| 154 | np.radians(180), [1, 0, 0]) |
| 155 | mesh.apply_transform(rot) |
| 156 | material = pyrender.MetallicRoughnessMaterial(metallicFactor=0.125, roughnessFactor=0.6, alphaMode='OPAQUE', baseColorFactor=(0.425, 0.72, 0.8, 1)) |
| 157 | mesh = pyrender.Mesh.from_trimesh(mesh, material=material, smooth=True) |
| 158 | |
| 159 | scene = pyrender.Scene(bg_color=[0.0, 0.0, 0.0, 0.0], ambient_light=(0.3, 0.3, 0.3)) |
| 160 | scene.add(mesh, 'mesh') |
| 161 | |
| 162 | focal, princpt = cam_param['focal'], cam_param['princpt'] |
| 163 | camera = pyrender.IntrinsicsCamera(fx=focal[0], fy=focal[1], cx=princpt[0], cy=princpt[1]) |
| 164 | scene.add(camera) |
| 165 | |
| 166 | # renderer |
| 167 | renderer = pyrender.OffscreenRenderer(viewport_width=img.shape[1], viewport_height=img.shape[0], point_size=1.0) |
| 168 | |
| 169 | # # light |
| 170 | light = pyrender.DirectionalLight(color=np.array([1.0, 1.0, 1.0]), intensity=0.8) |
| 171 | light_pose = np.eye(4) |
| 172 | light_pose[:3, 3] = np.array([0, -1, 1]) |
| 173 | scene.add(light, pose=light_pose) |
| 174 | light_pose[:3, 3] = np.array([0, 1, 1]) |
| 175 | scene.add(light, pose=light_pose) |
| 176 | light_pose[:3, 3] = np.array([1, 1, 2]) |
| 177 | scene.add(light, pose=light_pose) |
| 178 | |
| 179 | spot_l = pyrender.SpotLight(color=np.ones(3), |
| 180 | intensity=15.0, |
| 181 | innerConeAngle=np.pi / 3, |
| 182 | outerConeAngle=np.pi / 2) |
| 183 | |
| 184 | light_pose[:3, 3] = [1, 2, 2] |
| 185 | scene.add(spot_l, pose=light_pose) |
| 186 | |
| 187 | light_pose[:3, 3] = [-1, 2, 2] |
| 188 | scene.add(spot_l, pose=light_pose) |
| 189 | |
| 190 | # render |
| 191 | rgb, depth = renderer.render(scene, flags=pyrender.RenderFlags.RGBA | pyrender.RenderFlags.SHADOWS_DIRECTIONAL) |
| 192 | rgb = rgb[:,:,:3].astype(np.float32) |
| 193 | valid_mask = (depth > 0)[:,:,None] |
| 194 | |
| 195 | # save to image |
| 196 | img = rgb * valid_mask + img * (1-valid_mask) |
| 197 | return img |
| 198 | |
| 199 | def process_single_video(file_name, result_path): |
| 200 | video_name = os.path.basename(file_name).split('.pkl')[0] |
no test coverage detected