Spaces:
Running
Running
""" | |
Static pinhole camera | |
""" | |
import copy | |
import numpy as np | |
from COTR.utils import constants | |
from COTR.utils.constants import MAX_SIZE | |
from COTR.utils.utils import CropCamConfig | |
class PinholeCamera(): | |
def __init__(self, width, height, fx, fy, cx, cy): | |
self.width = int(width) | |
self.height = int(height) | |
self.fx = fx | |
self.fy = fy | |
self.cx = cx | |
self.cy = cy | |
def __str__(self): | |
string = 'width: {0}, height: {1}, fx: {2}, fy: {3}, cx: {4}, cy: {5}'.format(self.width, self.height, self.fx, self.fy, self.cx, self.cy) | |
return string | |
def shape(self): | |
return (self.height, self.width) | |
def intrinsic_mat(self): | |
mat = np.array([[self.fx, 0.0, self.cx], | |
[0.0, self.fy, self.cy], | |
[0.0, 0.0, 1.0]], dtype=constants.DEFAULT_PRECISION) | |
return mat | |
def rotate_pinhole_camera(cam, rot): | |
assert 0, 'TODO: Camera should stay the same while rotation' | |
assert rot in [0, 90, 180, 270], 'only support 0/90/180/270 degrees rotation' | |
if rot in [0, 180]: | |
return copy.deepcopy(cam) | |
elif rot in [90, 270]: | |
return PinholeCamera(width=cam.height, height=cam.width, fx=cam.fy, fy=cam.fx, cx=cam.cy, cy=cam.cx) | |
else: | |
raise NotImplementedError | |
def crop_pinhole_camera(pinhole_cam, crop_cam): | |
if crop_cam == 'no_crop': | |
cropped_pinhole_cam = pinhole_cam | |
elif crop_cam == 'crop_center': | |
_h = _w = min(*pinhole_cam.shape) | |
_cx = _cy = _h / 2 | |
cropped_pinhole_cam = PinholeCamera(_w, _h, pinhole_cam.fx, pinhole_cam.fy, _cx, _cy) | |
elif crop_cam == 'crop_center_and_resize': | |
_h = _w = MAX_SIZE | |
_cx = _cy = MAX_SIZE / 2 | |
scale = MAX_SIZE / min(*pinhole_cam.shape) | |
cropped_pinhole_cam = PinholeCamera(_w, _h, pinhole_cam.fx * scale, pinhole_cam.fy * scale, _cx, _cy) | |
elif isinstance(crop_cam, CropCamConfig): | |
scale = crop_cam.out_h / crop_cam.h | |
cropped_pinhole_cam = PinholeCamera(crop_cam.out_w, | |
crop_cam.out_h, | |
pinhole_cam.fx * scale, | |
pinhole_cam.fy * scale, | |
(pinhole_cam.cx - crop_cam.x) * scale, | |
(pinhole_cam.cy - crop_cam.y) * scale | |
) | |
else: | |
raise ValueError | |
return cropped_pinhole_cam | |