diff --git a/frigate/video.py b/frigate/video.py index e68a5f49e..1f59e6819 100755 --- a/frigate/video.py +++ b/frigate/video.py @@ -281,6 +281,13 @@ def reduce_boxes(boxes): reduced_boxes = cv2.groupRectangles([list(b) for b in itertools.chain(boxes, boxes)], 1, 0.2)[0] return [tuple(b) for b in reduced_boxes] +# modified from https://stackoverflow.com/a/40795835 +def intersects_any(box_a, boxes): + for box in boxes: + if box_a[2] < box[0] or box_a[0] > box[2] or box_a[1] < box[3] or box_a[3] > box[1]: + continue + return True + def detect(object_detector, frame, model_shape, region, objects_to_track, object_filters): tensor_input = create_tensor_input(frame, model_shape, region) @@ -350,7 +357,8 @@ def process_frames(camera_name: str, frame_queue: mp.Queue, frame_shape, model_s # look for motion motion_boxes = motion_detector.detect(frame) - tracked_object_boxes = [obj['box'] for obj in object_tracker.tracked_objects.values()] + # only get the tracked object boxes that intersect with motion + tracked_object_boxes = [obj['box'] for obj in object_tracker.tracked_objects.values() if intersects_any(obj['box'], motion_boxes)] # combine motion boxes with known locations of existing objects combined_boxes = reduce_boxes(motion_boxes + tracked_object_boxes)