Spaces:
Running
on
Zero
Running
on
Zero
import h5py | |
import numpy as np | |
import torch | |
class Camera: | |
def __init__(self, K, R, t): | |
self.K = K | |
self.R = R | |
self.t = t | |
def from_calibration_file(cls, path: str): | |
with h5py.File(path, "r") as f: | |
K = torch.tensor(np.array(f["K"]), dtype=torch.float32) | |
R = torch.tensor(np.array(f["R"]), dtype=torch.float32) | |
T = torch.tensor(np.array(f["T"]), dtype=torch.float32) | |
return cls(K, R, T) | |
def K_inv(self): | |
return self.K.inverse() | |
def to_cameradict(self): | |
fx = self.K[0, 0].item() | |
fy = self.K[1, 1].item() | |
cx = self.K[0, 2].item() | |
cy = self.K[1, 2].item() | |
params = { | |
"model": "PINHOLE", | |
"width": int(cx * 2), | |
"height": int(cy * 2), | |
"params": [fx, fy, cx, cy], | |
} | |
return params | |
def __repr__(self): | |
return f"ImageData(K={self.K}, R={self.R}, t={self.t})" | |
def cameras2F(cam1: Camera, cam2: Camera) -> torch.Tensor: | |
E = cameras2E(cam1, cam2) | |
return cam2.K_inv.T @ E @ cam1.K_inv | |
def cameras2E(cam1: Camera, cam2: Camera) -> torch.Tensor: | |
R = cam2.R @ cam1.R.T | |
T = cam2.t - R @ cam1.t | |
return cross_product_matrix(T) @ R | |
def cross_product_matrix(v) -> torch.Tensor: | |
"""Following en.wikipedia.org/wiki/Cross_product#Conversion_to_matrix_multiplication.""" | |
return torch.tensor( | |
[[0, -v[2], v[1]], [v[2], 0, -v[0]], [-v[1], v[0], 0]], | |
dtype=v.dtype, | |
device=v.device, | |
) | |