Realcat's picture
add: ripe
e6ac593
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
@classmethod
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)
@property
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,
)