Move queues per camera

This commit is contained in:
Josh Hawkins 2023-07-01 22:35:06 -05:00
parent 56d074ec4e
commit a5f407dba8

View File

@ -5,6 +5,7 @@ import logging
import queue import queue
import threading import threading
import time import time
from functools import partial
from multiprocessing.synchronize import Event as MpEvent from multiprocessing.synchronize import Event as MpEvent
import cv2 import cv2
@ -112,10 +113,8 @@ class PtzAutoTracker:
self.tracked_object_previous: dict[str, object] = {} self.tracked_object_previous: dict[str, object] = {}
self.object_types = {} self.object_types = {}
self.required_zones = {} self.required_zones = {}
self.move_queue = queue.Queue() self.move_queues = {}
self.move_thread = threading.Thread(target=self._process_move_queue) self.move_threads = {}
self.move_thread.daemon = True # Set the thread as a daemon thread
self.move_thread.start()
# if cam is set to autotrack, onvif should be set up # if cam is set to autotrack, onvif should be set up
for camera_name, cam in self.config.cameras.items(): for camera_name, cam in self.config.cameras.items():
@ -128,6 +127,8 @@ class PtzAutoTracker:
self.tracked_object[camera_name] = None self.tracked_object[camera_name] = None
self.tracked_object_previous[camera_name] = None self.tracked_object_previous[camera_name] = None
self.move_queues[camera_name] = queue.Queue()
if not onvif.cams[camera_name]["init"]: if not onvif.cams[camera_name]["init"]:
if not self.onvif._init_onvif(camera_name): if not self.onvif._init_onvif(camera_name):
return return
@ -140,24 +141,33 @@ class PtzAutoTracker:
f"Disabling autotracking for {camera_name}: FOV relative movement not supported" f"Disabling autotracking for {camera_name}: FOV relative movement not supported"
) )
def _process_move_queue(self): return
# movement thread per camera
self.move_threads[camera_name] = threading.Thread(
target=partial(self._process_move_queue, camera_name)
)
self.move_threads[camera_name].daemon = True
self.move_threads[camera_name].start()
def _process_move_queue(self, camera):
while True: while True:
try: try:
if self.move_queue.qsize() > 1: if self.move_queues[camera].qsize() > 1:
# Accumulate values since last moved # Accumulate values since last moved
pan = 0 pan = 0
tilt = 0 tilt = 0
while not self.move_queue.empty(): while not self.move_queues[camera].empty():
camera, queued_pan, queued_tilt = self.move_queue.get() queued_pan, queued_tilt = self.move_queues[camera].get()
logger.debug( logger.debug(
f"queue pan: {queued_pan}, queue tilt: {queued_tilt}" f"queue pan: {queued_pan}, queue tilt: {queued_tilt}"
) )
pan += queued_pan pan += queued_pan
tilt += queued_tilt tilt += queued_tilt
else: else:
move_data = self.move_queue.get() move_data = self.move_queues[camera].get()
camera, pan, tilt = move_data pan, tilt = move_data
logger.debug(f"removing pan: {pan}, removing tilt: {tilt}") logger.debug(f"removing pan: {pan}, removing tilt: {tilt}")
logger.debug(f"final pan: {pan}, final tilt: {tilt}") logger.debug(f"final pan: {pan}, final tilt: {tilt}")
@ -172,9 +182,9 @@ class PtzAutoTracker:
pass pass
def enqueue_move(self, camera, pan, tilt): def enqueue_move(self, camera, pan, tilt):
move_data = (camera, pan, tilt) move_data = (pan, tilt)
logger.debug(f"enqueue pan: {pan}, enqueue tilt: {tilt}") logger.debug(f"enqueue pan: {pan}, enqueue tilt: {tilt}")
self.move_queue.put(move_data) self.move_queues[camera].put(move_data)
def _autotrack_move_ptz(self, camera, obj): def _autotrack_move_ptz(self, camera, obj):
camera_config = self.config.cameras[camera] camera_config = self.config.cameras[camera]