Spaces:
Paused
Paused
import os | |
import random | |
import json | |
import torch | |
import torch.nn as nn | |
import torchvision.transforms as transforms | |
import torchvision.transforms.functional as F | |
import numpy as np | |
from einops import rearrange, repeat | |
class Camera(object): | |
def __init__(self, entry): | |
fx, fy, cx, cy = entry[1:5] | |
self.fx = fx | |
self.fy = fy | |
self.cx = cx | |
self.cy = cy | |
w2c_mat = np.array(entry[7:]).reshape(3, 4) | |
w2c_mat_4x4 = np.eye(4) | |
w2c_mat_4x4[:3, :] = w2c_mat | |
self.w2c_mat = w2c_mat_4x4 | |
self.c2w_mat = np.linalg.inv(w2c_mat_4x4) | |
def load_cameras(path): | |
with open(path, 'r') as f: | |
poses = f.readlines() | |
poses = [pose.strip().split(' ') for pose in poses[1:]] | |
cam_params = [[float(x) for x in pose] for pose in poses] | |
cam_params = [Camera(cam_param) for cam_param in cam_params] | |
return cam_params | |
def get_relative_pose(cam_params): | |
abs_w2cs = [cam_param.w2c_mat for cam_param in cam_params] | |
abs_c2ws = [cam_param.c2w_mat for cam_param in cam_params] | |
source_cam_c2w = abs_c2ws[0] | |
cam_to_origin = 0 | |
target_cam_c2w = np.array([ | |
[1, 0, 0, 0], | |
[0, 1, 0, -cam_to_origin], | |
[0, 0, 1, 0], | |
[0, 0, 0, 1] | |
]) | |
abs2rel = target_cam_c2w @ abs_w2cs[0] | |
ret_poses = [target_cam_c2w, ] + [abs2rel @ abs_c2w for abs_c2w in abs_c2ws[1:]] | |
ret_poses = np.array(ret_poses, dtype=np.float32) | |
return ret_poses | |
def get_K(intrinsics, size, do_normalize=False): | |
def normalize_intrinsic(x, size): | |
h, w = size | |
x[:,:,0:1] = x[:,:,0:1] / w | |
x[:,:,1:2] = x[:,:,1:2] / h | |
return x | |
b, _, t, _ = intrinsics.shape | |
K = torch.zeros((b, t, 9), dtype=intrinsics.dtype, device=intrinsics.device) | |
fx, fy, cx, cy = intrinsics.squeeze(1).chunk(4, dim=-1) | |
K[:,:,0:1] = fx | |
K[:,:,2:3] = cx | |
K[:,:,4:5] = fy | |
K[:,:,5:6] = cy | |
K[:,:,8:9] = 1.0 | |
K = rearrange(K, "b t (h w) -> b t h w", h=3, w=3) | |
if do_normalize: | |
K = normalize_intrinsic(K, size) | |
return K |