Преглед на файлове

区域停留逻辑优化

nifangxu преди 1 месец
родител
ревизия
b976d1ec3d
променени са 2 файла, в които са добавени 45 реда и са изтрити 74 реда
  1. 44 73
      alarm_plan.py
  2. 1 1
      core/alarm_plan_dispatcher.py

+ 44 - 73
core/alarm_plan.py → alarm_plan.py

@@ -335,17 +335,11 @@ class AlarmPlan:
         return None
 
 
-    # 停留事件
-    def handle_stay_detection(self):
-        try:
-            dev_id = self.dev_id_
-            device:Device = g_Dev.g_dev_mgr.find_dev_map(dev_id)
-            if not device:
-                return
-            now = get_utc_time_s()
-
-            # 查找最新的落在检测区域的目标
-            rtd_unit = self.find_latest_rtd_in_region(device, self.rect_, now, 3)
+    # 检查关键时间点, 获取停留时间
+    def get_stay_time(self, device: Device, t: int=1):
+        now = get_utc_time_s()
+        rtd_unit = self.find_latest_rtd_in_region(device, self.rect_, now, t)
+        with self.lock_:
             if rtd_unit:
                 timestamp = rtd_unit["timestamp"]
                 pose = rtd_unit["pose"]
@@ -358,20 +352,44 @@ class AlarmPlan:
                     self.event_attr_.leave_ts_ = timestamp
 
             if self.event_attr_.enter_ts_ == -1 or self.event_attr_.leave_ts_ == -1:
-                return
+                return -1
 
             # 归并时间内,不认为事件结束
             if now - self.event_attr_.leave_ts_  < self.merge_time_:
-                return
-
+                return -1
             self.event_attr_.stay_time_ = self.event_attr_.leave_ts_ - self.event_attr_.enter_ts_
-            stay_time =self.event_attr_.stay_time_
+
+        return self.event_attr_.stay_time_
+
+
+    # 检查停留时间
+    def check_stay_time(self, stay_time: int):
+        with self.lock_:
             # 时间小于触发时间阈值,忽略并重置
             if stay_time < self.threshold_time_ :
                 self.event_attr_.reset()
                 LOGINFO(f"less than threshold_time, alarm_plan: {self.plan_uuid_}, event_type: {self.event_type_}")
-                return
+                return -1
             LOGINFO(f"detected target leave, plan_uuid: {self.plan_uuid_}")
+            return 0
+
+
+    # 停留事件
+    def handle_stay_detection(self):
+        try:
+            dev_id = self.dev_id_
+            device:Device = g_Dev.g_dev_mgr.find_dev_map(dev_id)
+            if not device:
+                return
+
+            # 获取停留时间
+            stay_time = self.get_stay_time(device)
+            if stay_time == -1:
+                return
+
+            # 检查停留时间
+            if self.check_stay_time(stay_time) == -1:
+                return
 
             # 构造事件
             # 入库
@@ -422,36 +440,15 @@ class AlarmPlan:
             device:Device = g_Dev.g_dev_mgr.find_dev_map(dev_id)
             if not device:
                 return
-            now = get_utc_time_s()
-
-            # 查找最新的落在检测区域的目标
-            rtd_unit = self.find_latest_rtd_in_region(device, self.rect_, now, 3)
-            if rtd_unit:
-                timestamp = rtd_unit["timestamp"]
-                pose = rtd_unit["pose"]
-                target_point = rtd_unit["target_point"]
-
-                if self.event_attr_.enter_ts_ == -1:
-                    self.event_attr_.enter_ts_ = timestamp
-                    LOGINFO(f"detected target enter, plan_uuid: {self.plan_uuid_}")
-                else:
-                    self.event_attr_.leave_ts_ = timestamp
-
-            if self.event_attr_.enter_ts_ == -1 or self.event_attr_.leave_ts_ == -1:
-                return
 
-            # 归并时间内,不认为事件结束
-            if now - self.event_attr_.leave_ts_  < self.merge_time_:
+            # 获取停留时间
+            stay_time = self.get_stay_time(device)
+            if stay_time == -1:
                 return
 
-            self.event_attr_.stay_time_ = self.event_attr_.leave_ts_ - self.event_attr_.enter_ts_
-            stay_time =self.event_attr_.stay_time_
-            # 时间小于触发时间阈值,忽略并重置
-            if stay_time < self.threshold_time_ :
-                self.event_attr_.reset()
-                LOGINFO(f"less than threshold_time, alarm_plan: {self.plan_uuid_}, event_type: {self.event_type_}")
+            # 检查停留时间
+            if self.check_stay_time(stay_time) == -1:
                 return
-            LOGINFO(f"detected target leave, plan_uuid: {self.plan_uuid_}")
 
             # 构造事件
             # 入库
@@ -502,36 +499,15 @@ class AlarmPlan:
             device:Device = g_Dev.g_dev_mgr.find_dev_map(dev_id)
             if not device:
                 return
-            now = get_utc_time_s()
-
-            # 查找最新的落在检测区域的目标
-            rtd_unit = self.find_latest_rtd_in_region(device, self.rect_, now, 3)
-            if rtd_unit:
-                timestamp = rtd_unit["timestamp"]
-                pose = rtd_unit["pose"]
-                target_point = rtd_unit["target_point"]
-
-                if self.event_attr_.enter_ts_ == -1:
-                    self.event_attr_.enter_ts_ = timestamp
-                    LOGINFO(f"detected target enter, plan_uuid: {self.plan_uuid_}")
-                else:
-                    self.event_attr_.leave_ts_ = timestamp
-
-            if self.event_attr_.enter_ts_ == -1 or self.event_attr_.leave_ts_ == -1:
-                return
 
-            # 归并时间内,不认为事件结束
-            if now - self.event_attr_.leave_ts_  < self.merge_time_:
+            # 获取停留时间
+            stay_time = self.get_stay_time(device)
+            if stay_time == -1:
                 return
 
-            self.event_attr_.stay_time_ = self.event_attr_.leave_ts_ - self.event_attr_.enter_ts_
-            stay_time =self.event_attr_.stay_time_
-            # 时间小于触发时间阈值,忽略并重置
-            if stay_time < self.threshold_time_ :
-                self.event_attr_.reset()
-                LOGINFO(f"less than threshold_time, alarm_plan: {self.plan_uuid_}, event_type: {self.event_type_}")
+            # 检查停留时间
+            if self.check_stay_time(stay_time) == -1:
                 return
-            LOGINFO(f"detected target leave, plan_uuid: {self.plan_uuid_}")
 
             # 构造事件
             # 入库
@@ -575,7 +551,6 @@ class AlarmPlan:
                 LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error: {e}")
 
 
-
     # 如厕频次统计
     def handle_toileting_frequency(self):
         try:
@@ -611,7 +586,6 @@ class AlarmPlan:
                 LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error: {e}")
 
 
-
     # 夜间如厕频次统计
     def handle_night_toileting_frequency(self):
         try:
@@ -647,7 +621,6 @@ class AlarmPlan:
                 LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error: {e}")
 
 
-
     # 如厕频次异常
     def handle_toileting_frequency_abnormal(self):
         try:
@@ -683,7 +656,6 @@ class AlarmPlan:
                 LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error: {e}")
 
 
-
     # 起夜异常
     def handle_night_toileting_frequency_abnormal(self):
         try:
@@ -754,7 +726,6 @@ class AlarmPlan:
                 LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error: {e}")
 
 
-
     # 异常消失
     def handle_target_absence(self):
         try:

+ 1 - 1
core/alarm_plan_dispatcher.py

@@ -39,7 +39,7 @@ class AlarmPlanDispatcher:
     def worker(self):
         while self.running:
             try:
-                plan = self.task_queue.get(timeout=1)
+                plan: AlarmPlan = self.task_queue.get(timeout=1)
                 if plan is None:
                     break
                 if plan.handle_func_: