(viewpoint_cameras, n_frames=480)
| 171 | |
| 172 | |
| 173 | def generate_path(viewpoint_cameras, n_frames=480): |
| 174 | c2ws = np.array([np.linalg.inv(np.asarray((cam.world_view_transform.T).cpu().numpy())) for cam in viewpoint_cameras]) |
| 175 | pose = c2ws[:,:3,:] @ np.diag([1, -1, -1, 1]) |
| 176 | pose_recenter, colmap_to_world_transform = transform_poses_pca(pose) |
| 177 | |
| 178 | # generate new poses |
| 179 | new_poses = generate_ellipse_path(poses=pose_recenter, n_frames=n_frames) |
| 180 | # warp back to orignal scale |
| 181 | new_poses = np.linalg.inv(colmap_to_world_transform) @ pad_poses(new_poses) |
| 182 | |
| 183 | traj = [] |
| 184 | for c2w in new_poses: |
| 185 | c2w = c2w @ np.diag([1, -1, -1, 1]) |
| 186 | cam = copy.deepcopy(viewpoint_cameras[0]) |
| 187 | cam.image_height = int(cam.image_height / 2) * 2 |
| 188 | cam.image_width = int(cam.image_width / 2) * 2 |
| 189 | cam.world_view_transform = torch.from_numpy(np.linalg.inv(c2w).T).float().cuda() |
| 190 | cam.full_proj_transform = (cam.world_view_transform.unsqueeze(0).bmm(cam.projection_matrix.unsqueeze(0))).squeeze(0) |
| 191 | cam.camera_center = cam.world_view_transform.inverse()[3, :3] |
| 192 | traj.append(cam) |
| 193 | |
| 194 | return traj |
| 195 | |
| 196 | def load_img(pth: str) -> np.ndarray: |
| 197 | """Load an image and cast to float32.""" |
no test coverage detected