mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-07 03:35:26 +03:00
more zoom out conditions
This commit is contained in:
parent
80ffc690ed
commit
42a3036771
@ -57,6 +57,6 @@ INSERT_MANY_RECORDINGS = "insert_many_recordings"
|
|||||||
AUTOTRACKING_MOTION_MIN_DISTANCE = 20
|
AUTOTRACKING_MOTION_MIN_DISTANCE = 20
|
||||||
AUTOTRACKING_MOTION_MAX_POINTS = 500
|
AUTOTRACKING_MOTION_MAX_POINTS = 500
|
||||||
AUTOTRACKING_MAX_MOVE_METRICS = 500
|
AUTOTRACKING_MAX_MOVE_METRICS = 500
|
||||||
AUTOTRACKING_ZOOM_OUT_HYSTERESIS = 1.5
|
AUTOTRACKING_ZOOM_OUT_HYSTERESIS = 1.8
|
||||||
AUTOTRACKING_ZOOM_IN_HYSTERESIS = 0.9
|
AUTOTRACKING_ZOOM_IN_HYSTERESIS = 0.9
|
||||||
AUTOTRACKING_ZOOM_EDGE_THRESHOLD = 0.02
|
AUTOTRACKING_ZOOM_EDGE_THRESHOLD = 0.02
|
||||||
|
|||||||
@ -554,7 +554,7 @@ class PtzAutoTracker:
|
|||||||
|
|
||||||
def _below_distance_threshold(self, camera, obj):
|
def _below_distance_threshold(self, camera, obj):
|
||||||
# Returns true if Euclidean distance from object to center of frame is
|
# Returns true if Euclidean distance from object to center of frame is
|
||||||
# less than 20% of the of the larger dimension (width or height) of the frame,
|
# less than 10% of the of the larger dimension (width or height) of the frame,
|
||||||
# multiplied by a scaling factor for object size.
|
# multiplied by a scaling factor for object size.
|
||||||
# Distance is increased if object is not moving to prevent small ptz moves
|
# Distance is increased if object is not moving to prevent small ptz moves
|
||||||
# Adjusting this percentage slightly lower will effectively cause the camera to move
|
# Adjusting this percentage slightly lower will effectively cause the camera to move
|
||||||
@ -644,6 +644,8 @@ class PtzAutoTracker:
|
|||||||
|
|
||||||
target_box = obj.obj_data["area"] / (camera_width * camera_height)
|
target_box = obj.obj_data["area"] / (camera_width * camera_height)
|
||||||
|
|
||||||
|
below_area_threshold = target_box < 0.05
|
||||||
|
|
||||||
# introduce some hysteresis to prevent a yo-yo zooming effect
|
# introduce some hysteresis to prevent a yo-yo zooming effect
|
||||||
zoom_out_hysteresis = target_box > (
|
zoom_out_hysteresis = target_box > (
|
||||||
self.previous_target_box[camera] * AUTOTRACKING_ZOOM_OUT_HYSTERESIS
|
self.previous_target_box[camera] * AUTOTRACKING_ZOOM_OUT_HYSTERESIS
|
||||||
@ -672,6 +674,9 @@ class PtzAutoTracker:
|
|||||||
logger.debug(
|
logger.debug(
|
||||||
f"{camera}: Zoom test: below distance threshold: {(below_distance_threshold)}"
|
f"{camera}: Zoom test: below distance threshold: {(below_distance_threshold)}"
|
||||||
)
|
)
|
||||||
|
logger.debug(
|
||||||
|
f"{camera}: Zoom test: below area threshold: {(below_area_threshold)} target box: {target_box}"
|
||||||
|
)
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"{camera}: Zoom test: below dimension threshold: {below_dimension_threshold} width: {(bb_right - bb_left) / camera_width}, height: { (bb_bottom - bb_top) / camera_height}"
|
f"{camera}: Zoom test: below dimension threshold: {below_dimension_threshold} width: {(bb_right - bb_left) / camera_width}, height: { (bb_bottom - bb_top) / camera_height}"
|
||||||
)
|
)
|
||||||
@ -687,24 +692,35 @@ class PtzAutoTracker:
|
|||||||
f"{camera}: Zoom test: zoom out hysteresis limit: {zoom_out_hysteresis} previous: {self.previous_target_box[camera]} target: {target_box}"
|
f"{camera}: Zoom test: zoom out hysteresis limit: {zoom_out_hysteresis} previous: {self.previous_target_box[camera]} target: {target_box}"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Zoom in conditions
|
# Zoom in conditions (and)
|
||||||
|
# object area could be larger
|
||||||
|
# object is away from the edge of the frame
|
||||||
|
# object is not moving too quickly
|
||||||
|
# object is centered or small in the frame
|
||||||
|
# camera is not fully zoomed in
|
||||||
if (
|
if (
|
||||||
away_from_edge
|
zoom_in_hysteresis
|
||||||
and (below_distance_threshold or below_dimension_threshold)
|
and away_from_edge
|
||||||
and below_velocity_threshold
|
and below_velocity_threshold
|
||||||
|
and (below_distance_threshold or below_dimension_threshold)
|
||||||
and not at_max_zoom
|
and not at_max_zoom
|
||||||
and zoom_in_hysteresis
|
|
||||||
):
|
):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# Zoom out conditions
|
# Zoom out conditions (or)
|
||||||
|
# object area got too large, is touching an edge, and centered
|
||||||
|
# object area got too large and has at least one dimension that is too large
|
||||||
|
# object is touching an edge and either centered or has too large of an area
|
||||||
|
# object is moving too quickly
|
||||||
if (
|
if (
|
||||||
zoom_out_hysteresis
|
(zoom_out_hysteresis and not away_from_edge and below_distance_threshold)
|
||||||
and (not away_from_edge and below_distance_threshold)
|
or (zoom_out_hysteresis and not below_dimension_threshold)
|
||||||
|
or (
|
||||||
|
not away_from_edge
|
||||||
|
and (below_distance_threshold or not below_area_threshold)
|
||||||
|
)
|
||||||
or not below_velocity_threshold
|
or not below_velocity_threshold
|
||||||
or (not below_dimension_threshold and not below_distance_threshold)
|
) and not at_min_zoom:
|
||||||
and not at_min_zoom
|
|
||||||
):
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Don't zoom at all
|
# Don't zoom at all
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user