Force birdseye cameras into standard aspect ratios

This commit is contained in:
Nick Mowen 2023-07-03 20:02:07 -06:00
parent 83edf9574e
commit 6d192e4274

View File

@ -383,6 +383,13 @@ class BirdsEyeFrameManager:
) -> tuple[any]:
"""Calculate the optimal layout for 2+ cameras."""
def get_standard_aspect_ratio(camera_width, camera_height) -> tuple[int, int]:
"""Ensure that only standard aspect ratios are used."""
known_aspects = [(16, 9), (9, 16), (32, 9), (12, 9), (9, 12)] # aspects are scaled to be same ratio
known_aspects_ratios = list(map(lambda aspect: aspect[0] / aspect[1], known_aspects))
closest = min(known_aspects_ratios, key=lambda x:abs(x-(camera_width / camera_height)))
return known_aspects[known_aspects_ratios.index(closest)]
def map_layout(row_height: int):
"""Map the calculated layout."""
candidate_layout = []
@ -440,17 +447,7 @@ class BirdsEyeFrameManager:
for camera in cameras_to_add:
camera_dims = self.cameras[camera]["dimensions"].copy()
camera_gcd = math.gcd(camera_dims[0], camera_dims[1])
camera_aspect_x = camera_dims[0] / camera_gcd
camera_aspect_y = camera_dims[1] / camera_gcd
if round(camera_aspect_x / camera_aspect_y, 1) == 1.8:
# account for slightly off 16:9 cameras
camera_aspect_x = 16
camera_aspect_y = 9
elif round(camera_aspect_x / camera_aspect_y, 1) == 1.3:
# make 4:3 cameras the same relative size as 16:9
camera_aspect_x = 12
camera_aspect_y = 9
camera_aspect_x, camera_aspect_y = get_standard_aspect_ratio(camera_dims[0] / camera_gcd, camera_dims[1] / camera_gcd)
if camera_dims[1] > camera_dims[0]:
portrait = True