only cleanup old objects when motion is detected so stationary objects are still detected

This commit is contained in:
blakeblackshear 2019-03-15 20:15:41 -05:00
parent afb70f11a8
commit c12e19349e
2 changed files with 29 additions and 20 deletions

View File

@ -136,7 +136,8 @@ def main():
object_parser = ObjectParser(object_queue, objects_parsed, DETECTED_OBJECTS)
object_parser.start()
# start a thread to expire objects from the detected objects list
object_cleaner = ObjectCleaner(objects_parsed, DETECTED_OBJECTS)
object_cleaner = ObjectCleaner(objects_parsed, DETECTED_OBJECTS,
motion_changed, [region['motion_detected'] for region in regions])
object_cleaner.start()
# connect to mqtt and setup last will

View File

@ -20,14 +20,21 @@ class ObjectParser(threading.Thread):
self._objects_parsed.notify_all()
class ObjectCleaner(threading.Thread):
def __init__(self, objects_parsed, detected_objects):
def __init__(self, objects_parsed, detected_objects, motion_changed, motion_regions):
threading.Thread.__init__(self)
self._objects_parsed = objects_parsed
self._detected_objects = detected_objects
self.motion_changed = motion_changed
self.motion_regions = motion_regions
def run(self):
while True:
# while there is motion
while len([r for r in self.motion_regions if r.is_set()]) > 0:
# wait a bit before checking for expired frames
time.sleep(0.2)
# 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
@ -45,8 +52,9 @@ class ObjectCleaner(threading.Thread):
with self._objects_parsed:
self._objects_parsed.notify_all()
# wait a bit before checking for more expired frames
time.sleep(0.2)
# wait for the global motion flag to change
with self.motion_changed:
self.motion_changed.wait()
# Maintains the frame and person with the highest score from the most recent
# motion event