Add ability to get snapshot of birdseye when birdseye restream is enabled

This commit is contained in:
Nick Mowen 2022-12-28 08:21:14 -07:00
parent dcd195ade9
commit b349fdb13f
3 changed files with 37 additions and 2 deletions

View File

@ -825,6 +825,24 @@ def latest_frame(camera_name):
frame = cv2.resize(frame, dsize=(width, height), interpolation=cv2.INTER_AREA) frame = cv2.resize(frame, dsize=(width, height), interpolation=cv2.INTER_AREA)
ret, jpg = cv2.imencode(
".jpg", frame, [int(cv2.IMWRITE_JPEG_QUALITY), resize_quality]
)
response = make_response(jpg.tobytes())
response.headers["Content-Type"] = "image/jpeg"
response.headers["Cache-Control"] = "no-store"
return response
elif camera_name == "birdseye" and current_app.frigate_config.restream.birdseye:
frame = cv2.cvtColor(
current_app.detected_frames_processor.get_current_frame(camera_name),
cv2.COLOR_YUV2BGR_I420,
)
height = int(request.args.get("h", str(frame.shape[0])))
width = int(height * frame.shape[1] / frame.shape[0])
frame = cv2.resize(frame, dsize=(width, height), interpolation=cv2.INTER_AREA)
ret, jpg = cv2.imencode( ret, jpg = cv2.imencode(
".jpg", frame, [int(cv2.IMWRITE_JPEG_QUALITY), resize_quality] ".jpg", frame, [int(cv2.IMWRITE_JPEG_QUALITY), resize_quality]
) )

View File

@ -880,6 +880,12 @@ class TrackedObjectProcessor(threading.Thread):
return {} return {}
def get_current_frame(self, camera, draw_options={}): def get_current_frame(self, camera, draw_options={}):
if camera == "birdseye":
return self.frame_manager.get(
"birdseye",
(self.config.birdseye.height * 3 // 2, self.config.birdseye.width),
)
return self.camera_states[camera].get_current_frame(draw_options) return self.camera_states[camera].get_current_frame(draw_options)
def get_current_frame_time(self, camera) -> int: def get_current_frame_time(self, camera) -> int:

View File

@ -152,7 +152,7 @@ class BroadcastThread(threading.Thread):
class BirdsEyeFrameManager: class BirdsEyeFrameManager:
def __init__(self, config, frame_manager: SharedMemoryFrameManager): def __init__(self, config: FrigateConfig, frame_manager: SharedMemoryFrameManager):
self.config = config self.config = config
self.mode = config.birdseye.mode self.mode = config.birdseye.mode
self.frame_manager = frame_manager self.frame_manager = frame_manager
@ -463,6 +463,12 @@ def output_frames(config: FrigateConfig, video_output_queue):
birdseye_manager = BirdsEyeFrameManager(config, frame_manager) birdseye_manager = BirdsEyeFrameManager(config, frame_manager)
if config.restream.birdseye:
birdseye_buffer = frame_manager.create(
"birdseye",
birdseye_manager.yuv_shape[0] * birdseye_manager.yuv_shape[1],
)
while not stop_event.is_set(): while not stop_event.is_set():
try: try:
( (
@ -500,7 +506,12 @@ def output_frames(config: FrigateConfig, video_output_queue):
frame_time, frame_time,
frame, frame,
): ):
converters["birdseye"].write(birdseye_manager.frame.tobytes()) frame_bytes = birdseye_manager.frame.tobytes()
if config.restream.birdseye:
birdseye_buffer[:] = frame_bytes
converters["birdseye"].write(frame_bytes)
if camera in previous_frames: if camera in previous_frames:
frame_manager.delete(f"{camera}{previous_frames[camera]}") frame_manager.delete(f"{camera}{previous_frames[camera]}")