mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-07 11:45:24 +03:00
use constants and catch possible debug exception
This commit is contained in:
parent
2e788b2ca2
commit
ab5c44b91a
@ -51,3 +51,12 @@ MAX_PLAYLIST_SECONDS = 7200 # support 2 hour segments for a single playlist to
|
|||||||
# Internal Comms Topics
|
# Internal Comms Topics
|
||||||
|
|
||||||
INSERT_MANY_RECORDINGS = "insert_many_recordings"
|
INSERT_MANY_RECORDINGS = "insert_many_recordings"
|
||||||
|
|
||||||
|
# Autotracking
|
||||||
|
|
||||||
|
AUTOTRACKING_MOTION_MIN_DISTANCE = 20
|
||||||
|
AUTOTRACKING_MOTION_MAX_POINTS = 500
|
||||||
|
AUTOTRACKING_MAX_MOVE_METRICS = 500
|
||||||
|
AUTOTRACKING_ZOOM_OUT_HYSTERESIS = 1.5
|
||||||
|
AUTOTRACKING_ZOOM_IN_HYSTERESIS = 0.9
|
||||||
|
AUTOTRACKING_ZOOM_EDGE_THRESHOLD = 0.02
|
||||||
|
|||||||
@ -18,7 +18,15 @@ from norfair.camera_motion import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from frigate.config import CameraConfig, FrigateConfig, ZoomingModeEnum
|
from frigate.config import CameraConfig, FrigateConfig, ZoomingModeEnum
|
||||||
from frigate.const import CONFIG_DIR
|
from frigate.const import (
|
||||||
|
AUTOTRACKING_MAX_MOVE_METRICS,
|
||||||
|
AUTOTRACKING_MOTION_MAX_POINTS,
|
||||||
|
AUTOTRACKING_MOTION_MIN_DISTANCE,
|
||||||
|
AUTOTRACKING_ZOOM_EDGE_THRESHOLD,
|
||||||
|
AUTOTRACKING_ZOOM_IN_HYSTERESIS,
|
||||||
|
AUTOTRACKING_ZOOM_OUT_HYSTERESIS,
|
||||||
|
CONFIG_DIR,
|
||||||
|
)
|
||||||
from frigate.ptz.onvif import OnvifController
|
from frigate.ptz.onvif import OnvifController
|
||||||
from frigate.types import PTZMetricsTypes
|
from frigate.types import PTZMetricsTypes
|
||||||
from frigate.util.builtin import update_yaml_file
|
from frigate.util.builtin import update_yaml_file
|
||||||
@ -70,8 +78,8 @@ class PtzMotionEstimator:
|
|||||||
|
|
||||||
self.norfair_motion_estimator = MotionEstimator(
|
self.norfair_motion_estimator = MotionEstimator(
|
||||||
transformations_getter=transformation_type,
|
transformations_getter=transformation_type,
|
||||||
min_distance=30,
|
min_distance=AUTOTRACKING_MOTION_MIN_DISTANCE,
|
||||||
max_points=900,
|
max_points=AUTOTRACKING_MOTION_MAX_POINTS,
|
||||||
)
|
)
|
||||||
|
|
||||||
self.coord_transformations = None
|
self.coord_transformations = None
|
||||||
@ -108,9 +116,6 @@ class PtzMotionEstimator:
|
|||||||
self.coord_transformations = self.norfair_motion_estimator.update(
|
self.coord_transformations = self.norfair_motion_estimator.update(
|
||||||
frame, mask
|
frame, mask
|
||||||
)
|
)
|
||||||
logger.debug(
|
|
||||||
f"{camera}: Motion estimator transformation: {self.coord_transformations.rel_to_abs([[0,0]])}"
|
|
||||||
)
|
|
||||||
except Exception:
|
except Exception:
|
||||||
# sometimes opencv can't find enough features in the image to find homography, so catch this error
|
# sometimes opencv can't find enough features in the image to find homography, so catch this error
|
||||||
# https://github.com/tryolabs/norfair/pull/278
|
# https://github.com/tryolabs/norfair/pull/278
|
||||||
@ -119,6 +124,13 @@ class PtzMotionEstimator:
|
|||||||
)
|
)
|
||||||
self.coord_transformations = None
|
self.coord_transformations = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
logger.debug(
|
||||||
|
f"{camera}: Motion estimator transformation: {self.coord_transformations.rel_to_abs([[0,0]])}"
|
||||||
|
)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
self.frame_manager.close(frame_id)
|
self.frame_manager.close(frame_id)
|
||||||
|
|
||||||
return self.coord_transformations
|
return self.coord_transformations
|
||||||
@ -344,7 +356,7 @@ class PtzAutoTracker:
|
|||||||
if calibration or (
|
if calibration or (
|
||||||
len(self.move_metrics[camera]) % 50 == 0
|
len(self.move_metrics[camera]) % 50 == 0
|
||||||
and len(self.move_metrics[camera]) != 0
|
and len(self.move_metrics[camera]) != 0
|
||||||
and len(self.move_metrics[camera]) <= 500
|
and len(self.move_metrics[camera]) <= AUTOTRACKING_MAX_MOVE_METRICS
|
||||||
):
|
):
|
||||||
X = np.array(
|
X = np.array(
|
||||||
[abs(d["pan"]) + abs(d["tilt"]) for d in self.move_metrics[camera]]
|
[abs(d["pan"]) + abs(d["tilt"]) for d in self.move_metrics[camera]]
|
||||||
@ -454,7 +466,8 @@ class PtzAutoTracker:
|
|||||||
# save metrics for better estimate calculations
|
# save metrics for better estimate calculations
|
||||||
if (
|
if (
|
||||||
self.intercept[camera] is not None
|
self.intercept[camera] is not None
|
||||||
and len(self.move_metrics[camera]) < 500
|
and len(self.move_metrics[camera])
|
||||||
|
< AUTOTRACKING_MAX_MOVE_METRICS
|
||||||
and (pan != 0 or tilt != 0)
|
and (pan != 0 or tilt != 0)
|
||||||
and self.config.cameras[
|
and self.config.cameras[
|
||||||
camera
|
camera
|
||||||
@ -593,7 +606,7 @@ class PtzAutoTracker:
|
|||||||
bb_left, bb_top, bb_right, bb_bottom = box
|
bb_left, bb_top, bb_right, bb_bottom = box
|
||||||
|
|
||||||
# TODO: Take into account the area changing when an object is moving out of frame
|
# TODO: Take into account the area changing when an object is moving out of frame
|
||||||
edge_threshold = 0.02
|
edge_threshold = AUTOTRACKING_ZOOM_EDGE_THRESHOLD
|
||||||
|
|
||||||
# calculate a velocity threshold based on movement coefficients if available
|
# calculate a velocity threshold based on movement coefficients if available
|
||||||
if camera_config.onvif.autotracking.movement_weights:
|
if camera_config.onvif.autotracking.movement_weights:
|
||||||
@ -637,8 +650,12 @@ class PtzAutoTracker:
|
|||||||
target_box = obj.obj_data["area"] / (camera_width * camera_height)
|
target_box = obj.obj_data["area"] / (camera_width * camera_height)
|
||||||
|
|
||||||
# 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 > (self.previous_target_box[camera] * 1.2)
|
zoom_out_hysteresis = target_box > (
|
||||||
zoom_in_hysteresis = target_box < (self.previous_target_box[camera] * 0.9)
|
self.previous_target_box[camera] * AUTOTRACKING_ZOOM_OUT_HYSTERESIS
|
||||||
|
)
|
||||||
|
zoom_in_hysteresis = target_box < (
|
||||||
|
self.previous_target_box[camera] * AUTOTRACKING_ZOOM_IN_HYSTERESIS
|
||||||
|
)
|
||||||
|
|
||||||
at_max_zoom = self.ptz_metrics[camera]["ptz_zoom_level"].value == 1
|
at_max_zoom = self.ptz_metrics[camera]["ptz_zoom_level"].value == 1
|
||||||
at_min_zoom = self.ptz_metrics[camera]["ptz_zoom_level"].value == 0
|
at_min_zoom = self.ptz_metrics[camera]["ptz_zoom_level"].value == 0
|
||||||
@ -783,7 +800,9 @@ class PtzAutoTracker:
|
|||||||
if camera_config.onvif.autotracking.zooming == ZoomingModeEnum.relative:
|
if camera_config.onvif.autotracking.zooming == ZoomingModeEnum.relative:
|
||||||
if self.tracked_object_previous[camera] is None:
|
if self.tracked_object_previous[camera] is None:
|
||||||
# start with a slightly altered box to encourage an initial zoom
|
# start with a slightly altered box to encourage an initial zoom
|
||||||
self.previous_target_box[camera] = target_box * 1.15
|
self.previous_target_box[camera] = target_box * (
|
||||||
|
AUTOTRACKING_ZOOM_OUT_HYSTERESIS - 0.05
|
||||||
|
)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
result := self._should_zoom_in(
|
result := self._should_zoom_in(
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user