(poses, bds)
| 182 | |
| 183 | |
| 184 | def spherify_poses(poses, bds): |
| 185 | |
| 186 | p34_to_44 = lambda p : np.concatenate([p, np.tile(np.reshape(np.eye(4)[-1,:], [1,1,4]), [p.shape[0], 1,1])], 1) |
| 187 | |
| 188 | rays_d = poses[:,:3,2:3] |
| 189 | rays_o = poses[:,:3,3:4] |
| 190 | |
| 191 | def min_line_dist(rays_o, rays_d): |
| 192 | A_i = np.eye(3) - rays_d * np.transpose(rays_d, [0,2,1]) |
| 193 | b_i = -A_i @ rays_o |
| 194 | pt_mindist = np.squeeze(-np.linalg.inv((np.transpose(A_i, [0,2,1]) @ A_i).mean(0)) @ (b_i).mean(0)) |
| 195 | return pt_mindist |
| 196 | |
| 197 | pt_mindist = min_line_dist(rays_o, rays_d) |
| 198 | |
| 199 | center = pt_mindist |
| 200 | up = (poses[:,:3,3] - center).mean(0) |
| 201 | |
| 202 | vec0 = normalize(up) |
| 203 | vec1 = normalize(np.cross([.1,.2,.3], vec0)) |
| 204 | vec2 = normalize(np.cross(vec0, vec1)) |
| 205 | pos = center |
| 206 | c2w = np.stack([vec1, vec2, vec0, pos], 1) |
| 207 | |
| 208 | poses_reset = np.linalg.inv(p34_to_44(c2w[None])) @ p34_to_44(poses[:,:3,:4]) |
| 209 | |
| 210 | rad = np.sqrt(np.mean(np.sum(np.square(poses_reset[:,:3,3]), -1))) |
| 211 | |
| 212 | sc = 1./rad |
| 213 | poses_reset[:,:3,3] *= sc |
| 214 | bds *= sc |
| 215 | rad *= sc |
| 216 | |
| 217 | centroid = np.mean(poses_reset[:,:3,3], 0) |
| 218 | zh = centroid[2] |
| 219 | radcircle = np.sqrt(rad**2-zh**2) |
| 220 | new_poses = [] |
| 221 | |
| 222 | for th in np.linspace(0.,2.*np.pi, 120): |
| 223 | |
| 224 | camorigin = np.array([radcircle * np.cos(th), radcircle * np.sin(th), zh]) |
| 225 | up = np.array([0,0,-1.]) |
| 226 | |
| 227 | vec2 = normalize(camorigin) |
| 228 | vec0 = normalize(np.cross(vec2, up)) |
| 229 | vec1 = normalize(np.cross(vec2, vec0)) |
| 230 | pos = camorigin |
| 231 | p = np.stack([vec0, vec1, vec2, pos], 1) |
| 232 | |
| 233 | new_poses.append(p) |
| 234 | |
| 235 | new_poses = np.stack(new_poses, 0) |
| 236 | |
| 237 | new_poses = np.concatenate([new_poses, np.broadcast_to(poses[0,:3,-1:], new_poses[:,:3,-1:].shape)], -1) |
| 238 | poses_reset = np.concatenate([poses_reset[:,:3,:4], np.broadcast_to(poses[0,:3,-1:], poses_reset[:,:3,-1:].shape)], -1) |
| 239 | |
| 240 | return poses_reset, new_poses, bds |
| 241 |
no test coverage detected