roll-ai's picture
Upload 177 files
59d751c verified
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