|
@@ -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:
|