mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-11-21 19:07:46 +01:00
48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
|
import time
|
||
|
import datetime
|
||
|
import threading
|
||
|
|
||
|
class ObjectParser(threading.Thread):
|
||
|
def __init__(self, object_queue, objects_parsed, detected_objects):
|
||
|
threading.Thread.__init__(self)
|
||
|
self._object_queue = object_queue
|
||
|
self._objects_parsed = objects_parsed
|
||
|
self._detected_objects = detected_objects
|
||
|
|
||
|
def run(self):
|
||
|
while True:
|
||
|
obj = self._object_queue.get()
|
||
|
self._detected_objects.append(obj)
|
||
|
|
||
|
# notify that objects were parsed
|
||
|
with self._objects_parsed:
|
||
|
self._objects_parsed.notify_all()
|
||
|
|
||
|
class ObjectCleaner(threading.Thread):
|
||
|
def __init__(self, objects_parsed, detected_objects):
|
||
|
threading.Thread.__init__(self)
|
||
|
self._objects_parsed = objects_parsed
|
||
|
self._detected_objects = detected_objects
|
||
|
|
||
|
def run(self):
|
||
|
while True:
|
||
|
|
||
|
# expire the objects that are more than 1 second old
|
||
|
now = datetime.datetime.now().timestamp()
|
||
|
# look for the first object found within the last second
|
||
|
# (newest objects are appended to the end)
|
||
|
detected_objects = self._detected_objects.copy()
|
||
|
num_to_delete = 0
|
||
|
for obj in detected_objects:
|
||
|
if now-obj['frame_time']<1:
|
||
|
break
|
||
|
num_to_delete += 1
|
||
|
if num_to_delete > 0:
|
||
|
del self._detected_objects[:num_to_delete]
|
||
|
|
||
|
# notify that parsed objects were changed
|
||
|
with self._objects_parsed:
|
||
|
self._objects_parsed.notify_all()
|
||
|
|
||
|
# wait a bit before checking for more expired frames
|
||
|
time.sleep(0.2)
|