mirror of
https://github.com/blakeblackshear/frigate.git
synced 2025-01-02 00:07:11 +01:00
Fix camera access and improve typing (#15272)
* Fix camera access and improve typing: * Formatting
This commit is contained in:
parent
f094c59cd0
commit
ee816b2251
@ -35,8 +35,9 @@ from frigate.const import (
|
||||
CLIPS_DIR,
|
||||
)
|
||||
from frigate.embeddings import EmbeddingsContext
|
||||
from frigate.events.external import ExternalEventProcessor
|
||||
from frigate.models import Event, ReviewSegment, Timeline
|
||||
from frigate.object_processing import TrackedObject
|
||||
from frigate.object_processing import TrackedObject, TrackedObjectProcessor
|
||||
from frigate.util.builtin import get_tz_modifiers
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@ -1087,9 +1088,11 @@ def create_event(
|
||||
)
|
||||
|
||||
try:
|
||||
frame = request.app.detected_frames_processor.get_current_frame(camera_name)
|
||||
frame_processor: TrackedObjectProcessor = request.app.detected_frames_processor
|
||||
external_processor: ExternalEventProcessor = request.app.external_processor
|
||||
|
||||
event_id = request.app.external_processor.create_manual_event(
|
||||
frame = frame_processor.get_current_frame(camera_name)
|
||||
event_id = external_processor.create_manual_event(
|
||||
camera_name,
|
||||
label,
|
||||
body.source_type,
|
||||
|
@ -36,6 +36,7 @@ from frigate.const import (
|
||||
RECORD_DIR,
|
||||
)
|
||||
from frigate.models import Event, Previews, Recordings, Regions, ReviewSegment
|
||||
from frigate.object_processing import TrackedObjectProcessor
|
||||
from frigate.util.builtin import get_tz_modifiers
|
||||
from frigate.util.image import get_image_from_recording
|
||||
|
||||
@ -79,7 +80,11 @@ def mjpeg_feed(
|
||||
|
||||
|
||||
def imagestream(
|
||||
detected_frames_processor, camera_name: str, fps: int, height: int, draw_options
|
||||
detected_frames_processor: TrackedObjectProcessor,
|
||||
camera_name: str,
|
||||
fps: int,
|
||||
height: int,
|
||||
draw_options: dict[str, any],
|
||||
):
|
||||
while True:
|
||||
# max out at specified FPS
|
||||
@ -118,6 +123,7 @@ def latest_frame(
|
||||
extension: Extension,
|
||||
params: MediaLatestFrameQueryParams = Depends(),
|
||||
):
|
||||
frame_processor: TrackedObjectProcessor = request.app.detected_frames_processor
|
||||
draw_options = {
|
||||
"bounding_boxes": params.bbox,
|
||||
"timestamp": params.timestamp,
|
||||
@ -129,17 +135,14 @@ def latest_frame(
|
||||
quality = params.quality
|
||||
|
||||
if camera_name in request.app.frigate_config.cameras:
|
||||
frame = request.app.detected_frames_processor.get_current_frame(
|
||||
camera_name, draw_options
|
||||
)
|
||||
frame = frame_processor.get_current_frame(camera_name, draw_options)
|
||||
retry_interval = float(
|
||||
request.app.frigate_config.cameras.get(camera_name).ffmpeg.retry_interval
|
||||
or 10
|
||||
)
|
||||
|
||||
if frame is None or datetime.now().timestamp() > (
|
||||
request.app.detected_frames_processor.get_current_frame_time(camera_name)
|
||||
+ retry_interval
|
||||
frame_processor.get_current_frame_time(camera_name) + retry_interval
|
||||
):
|
||||
if request.app.camera_error_image is None:
|
||||
error_image = glob.glob("/opt/frigate/frigate/images/camera-error.jpg")
|
||||
@ -180,7 +183,7 @@ def latest_frame(
|
||||
)
|
||||
elif camera_name == "birdseye" and request.app.frigate_config.birdseye.restream:
|
||||
frame = cv2.cvtColor(
|
||||
request.app.detected_frames_processor.get_current_frame(camera_name),
|
||||
frame_processor.get_current_frame(camera_name),
|
||||
cv2.COLOR_YUV2BGR_I420,
|
||||
)
|
||||
|
||||
@ -813,15 +816,15 @@ def grid_snapshot(
|
||||
):
|
||||
if camera_name in request.app.frigate_config.cameras:
|
||||
detect = request.app.frigate_config.cameras[camera_name].detect
|
||||
frame = request.app.detected_frames_processor.get_current_frame(camera_name, {})
|
||||
frame_processor: TrackedObjectProcessor = request.app.detected_frames_processor
|
||||
frame = frame_processor.get_current_frame(camera_name, {})
|
||||
retry_interval = float(
|
||||
request.app.frigate_config.cameras.get(camera_name).ffmpeg.retry_interval
|
||||
or 10
|
||||
)
|
||||
|
||||
if frame is None or datetime.now().timestamp() > (
|
||||
request.app.detected_frames_processor.get_current_frame_time(camera_name)
|
||||
+ retry_interval
|
||||
frame_processor.get_current_frame_time(camera_name) + retry_interval
|
||||
):
|
||||
return JSONResponse(
|
||||
content={"success": False, "message": "Unable to get valid frame"},
|
||||
|
@ -10,6 +10,7 @@ from enum import Enum
|
||||
from typing import Optional
|
||||
|
||||
import cv2
|
||||
from numpy import ndarray
|
||||
|
||||
from frigate.comms.detections_updater import DetectionPublisher, DetectionTypeEnum
|
||||
from frigate.comms.events_updater import EventUpdatePublisher
|
||||
@ -45,7 +46,7 @@ class ExternalEventProcessor:
|
||||
duration: Optional[int],
|
||||
include_recording: bool,
|
||||
draw: dict[str, any],
|
||||
snapshot_frame: any,
|
||||
snapshot_frame: Optional[ndarray],
|
||||
) -> str:
|
||||
now = datetime.datetime.now().timestamp()
|
||||
camera_config = self.config.cameras.get(camera)
|
||||
@ -131,8 +132,11 @@ class ExternalEventProcessor:
|
||||
label: str,
|
||||
event_id: str,
|
||||
draw: dict[str, any],
|
||||
img_frame: any,
|
||||
) -> str:
|
||||
img_frame: Optional[ndarray],
|
||||
) -> Optional[str]:
|
||||
if not img_frame:
|
||||
return None
|
||||
|
||||
# write clean snapshot if enabled
|
||||
if camera_config.snapshots.clean_copy:
|
||||
ret, png = cv2.imencode(".png", img_frame)
|
||||
|
@ -6,7 +6,7 @@ import queue
|
||||
import threading
|
||||
from collections import Counter, defaultdict
|
||||
from multiprocessing.synchronize import Event as MpEvent
|
||||
from typing import Callable
|
||||
from typing import Callable, Optional
|
||||
|
||||
import cv2
|
||||
import numpy as np
|
||||
@ -784,13 +784,18 @@ class TrackedObjectProcessor(threading.Thread):
|
||||
else:
|
||||
return {}
|
||||
|
||||
def get_current_frame(self, camera, draw_options={}):
|
||||
def get_current_frame(
|
||||
self, camera: str, draw_options: dict[str, any] = {}
|
||||
) -> Optional[np.ndarray]:
|
||||
if camera == "birdseye":
|
||||
return self.frame_manager.get(
|
||||
"birdseye",
|
||||
(self.config.birdseye.height * 3 // 2, self.config.birdseye.width),
|
||||
)
|
||||
|
||||
if camera not in self.camera_states:
|
||||
return None
|
||||
|
||||
return self.camera_states[camera].get_current_frame(draw_options)
|
||||
|
||||
def get_current_frame_time(self, camera) -> int:
|
||||
|
Loading…
Reference in New Issue
Block a user