diff --git a/frigate/output.py b/frigate/output.py index ab928efb5..f4d9bb0c3 100644 --- a/frigate/output.py +++ b/frigate/output.py @@ -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