scripts/util/rig.py (69 lines of code) (raw):
#!/usr/bin/env python3
# Copyright 2004-present Facebook. All Rights Reserved.
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.
import json
import random
from camera import Camera
from logger import Logger
log = Logger(__name__)
log.logger.propagate = False
RAND_MAX = 2147483647
class Rig:
"""The Rig class represents a list of Cameras
Attributes:
cameras ([Camera]) : list of cameras in the rig
comments ([string]) : list of comments
"""
def __init__(self, json_file=None, json_string=None):
if json_file:
self.load_from_json_file(json_file)
elif json_string:
self.load_from_json_string(json_string)
def load_from_json_file(self, json_file):
with open(json_file) as f:
json_string = f.read()
log.check(json_string) # check that JSON file was read
self.load_from_json_string(json_string)
def load_from_json_string(self, json_string):
json_obj = json.loads(json_string)
self.cameras = []
json_cameras = json_obj["cameras"]
for json_camera in json_cameras:
json_camera_string = json.dumps(json_camera)
camera = Camera(json_string=json_camera_string)
self.cameras.append(camera)
self.comments = []
if "comments" in json_obj:
json_comments = json_obj["comments"]
for json_comment in json_comments:
json_comment_string = json.dumps(json_comment)
self.comments.append(json_comment_string)
def normalize(self):
for cam in self.cameras:
if not cam.is_normalized():
cam.normalize()
def find_camera_by_id(self, id):
for cam in self.cameras:
if cam.id == id:
return cam
log.fatal(f"Camera id {id} not found")
def save_to_file(self, filename):
rig_json = {"cameras": []}
for camera in self.cameras:
camera_json = camera.serialize()
rig_json["cameras"].append(camera_json)
rig_json.update({"comments": self.comments})
with open(filename, "w") as f:
f.write(json.dumps(rig_json, sort_keys=True, indent=2))
@classmethod
def perturb_cameras(
cls, cameras, pos_amount, rot_amount, principal_amount, focal_amount
):
for i in range(0, len(cameras)):
camera = cameras[i]
if i != 0:
camera.position = perturb_vector(camera.position, pos_amount)
rotvec = perturb_vector(camera.get_rotation_vector(), rot_amount)
camera.set_rotation_vector(rotvec)
camera.principal = perturb_vector(camera.principal, principal_amount)
if focal_amount != 0:
scalar_focal = perturb_scalar(camera.get_scalar_focal(), focal_amount)
camera.set_scalar_focal(scalar_focal)
def perturb_scalar(scalar, amount):
return scalar + amount * 2 * (random.randint(0, RAND_MAX) / RAND_MAX - 0.5)
def perturb_vector(vector, amount):
for i in range(0, len(vector)):
vector[i] = perturb_scalar(vector[i], amount)
return vector