|
|
|
|
|
|
|
|
|
|
|
|
|
import json |
|
import cv2 |
|
import numpy as np |
|
import copy |
|
import importlib |
|
from typing import Any, Dict |
|
|
|
def load_module(module_name, class_name=None, silent: bool = False): |
|
module = importlib.import_module(module_name) |
|
return getattr(module, class_name) if class_name else module |
|
|
|
|
|
def load_class(class_name): |
|
return load_module(*class_name.rsplit(".", 1)) |
|
|
|
|
|
def load_from_config(config, **kwargs): |
|
"""Instantiate an object given a config and arguments.""" |
|
assert "class_name" in config and "module_name" not in config |
|
config = copy.deepcopy(config) |
|
class_name = config.pop("class_name") |
|
object_class = load_class(class_name) |
|
return object_class(**config, **kwargs) |
|
|
|
|
|
def load_opencv_calib(extrin_path, intrin_path): |
|
cameras = {} |
|
|
|
fse = cv2.FileStorage() |
|
fse.open(extrin_path, cv2.FileStorage_READ) |
|
|
|
fsi = cv2.FileStorage() |
|
fsi.open(intrin_path, cv2.FileStorage_READ) |
|
|
|
names = [ |
|
fse.getNode("names").at(c).string() for c in range(fse.getNode("names").size()) |
|
] |
|
|
|
for camera in names: |
|
rot = fse.getNode(f"R_{camera}").mat() |
|
R = fse.getNode(f"Rot_{camera}").mat() |
|
T = fse.getNode(f"T_{camera}").mat() |
|
R_pred = cv2.Rodrigues(rot)[0] |
|
assert np.all(np.isclose(R_pred, R)) |
|
K = fsi.getNode(f"K_{camera}").mat() |
|
cameras[camera] = { |
|
"Rt": np.concatenate([R, T], axis=1).astype(np.float32), |
|
"K": K.astype(np.float32), |
|
} |
|
return cameras |