This commit is contained in:
邓智航
2026-03-06 17:01:22 +08:00
parent fd4d180eb1
commit 453273a2c6

View File

@@ -13,6 +13,7 @@ import mediapipe as mp
from analyzer import MonitorSystem
from webrtc_server import WebRTCServer
from HeartRateMonitor import HeartRateMonitor
from hook_mocker import HookMocker
API_URL = "http://10.128.48.48:5000/api/states"
CAMERA_ID = 5
@@ -446,107 +447,114 @@ def alert_thread(server):
alert_st = ""
level = 0
while not stop_event.is_set():
frame = ana_video_queue.get(timeout=1)
buffered_frame.append(frame)
now = time.time()
data = None
if now - alert_time >= 1:
data = ana_data_queue.get(timeout=1)
# sleep_time
if data["ear"] < 0.2:
sleep_time += 1
else:
sleep_time = 0
try:
frame = ana_video_queue.get(timeout=1)
buffered_frame.append(frame)
now = time.time()
data = None
if now - alert_time >= 1:
data = ana_data_queue.get(timeout=1)
# haqian_time
if data["mar"] > 0.95:
haqian_time += 1
# heart_spe
heart_spe += data["heart_rate"]
heart_num += 1
# sleep_time
if data["ear"] < 0.2:
sleep_time += 1
else:
sleep_time = 0
# haqian_time
if data["mar"] > 0.95:
haqian_time += 1
# heart_spe
heart_spe += data["heart_rate"]
heart_num += 1
# eye_close
if data["eye_close_freq"] > 20:
eye_close = True
# down_emo_time
if data["label"] in ["sad", "bored", "sleepy", "angry", "annoying"]:
down_emo_time += 1
# eye_close
if data["eye_close_freq"] > 20:
eye_close = True
# down_emo_time
if data["label"] in ["sad", "bored", "sleepy", "angry", "annoying"]:
down_emo_time += 1
# pianyi_time
if data["pose_0"] > 25 or data["pose_0"] < -10 or data["pose_1"] > 50 or data["pose_1"] < -50:
pianyi_time += 1
# no_face_time
if data["label"] == "":
no_face_time += 1
# pianyi_time
if data["pose_0"] > 25 or data["pose_0"] < -10 or data["pose_1"] > 50 or data["pose_1"] < -50:
pianyi_time += 1
# no_face_time
if data["label"] == "":
no_face_time += 1
alert_time = now
alert_time = now
if sleep_time >= 20:
alert_status = True
alert_st += alert_info["sleep_time"] + "; "
sleep_time = 0
level += 1
if pianyi_time >= 20:
alert_status = True
alert_st += alert_info["pianyi_time"] + "; "
pianyi_time = 0
level += 1
if no_face_time >= 60:
alert_status = True
alert_st += alert_info["no_face_time"] + "; "
no_face_time = 0
level += 1
if sleep_time >= 20:
alert_status = True
alert_st += alert_info["sleep_time"] + "; "
sleep_time = 0
level += 1
if pianyi_time >= 20:
alert_status = True
alert_st += alert_info["pianyi_time"] + "; "
pianyi_time = 0
level += 1
if no_face_time >= 60:
alert_status = True
alert_st += alert_info["no_face_time"] + "; "
no_face_time = 0
level += 1
if now - emo_time >= 300:
if down_emo_time > 150:
alert_status = True
alert_st += alert_info["down_emo_time"] + "; "
level += 1
emo_time = now
down_emo_time = 0
if now - emo_time >= 300:
if down_emo_time > 150:
alert_status = True
alert_st += alert_info["down_emo_time"] + "; "
level += 1
emo_time = now
down_emo_time = 0
if now - last_record_time >= 60:
heart_spe = heart_spe // heart_num if heart_num != 0 else 0
if haqian_time > 5:
alert_status = True
alert_st += alert_info["haqian_time"] + ";"
level += 1
if heart_spe < 60 or heart_spe > 120:
alert_status = True
alert_st += alert_info["heart_spe"] + ";"
level += 1
if eye_close:
alert_status = True
alert_st += alert_info["eye_close"] + ";"
level += 1
#TODO: 发送警报
haqian_time = 0
heart_spe = 0
heart_num = 0
eye_close = False
last_record_time = now
info_level = ""
if level >= 6:
info_level = "严重"
elif level >=4:
info_level = "中等"
else:
info_level = "轻微"
if alert_status:
print(f"警报: {alert_st}")
alert = server.alert(int(time.time()), alert_st, info_level)
alert.start(width=1280, height=720, fps=30)
for f in buffered_frame:
alert.provide_frame(f)
alert.end()
alert_status = False
alert_st = ""
buffered_frame = []
level = 0
if now - last_record_time >= 60:
heart_spe = heart_spe // heart_num if heart_num != 0 else 0
if haqian_time > 5:
alert_status = True
alert_st += alert_info["haqian_time"] + ";"
level += 1
if heart_spe < 60 or heart_spe > 120:
alert_status = True
alert_st += alert_info["heart_spe"] + ";"
level += 1
if eye_close:
alert_status = True
alert_st += alert_info["eye_close"] + ";"
level += 1
#TODO: 发送警报
haqian_time = 0
heart_spe = 0
heart_num = 0
eye_close = False
last_record_time = now
info_level = ""
if level >= 6:
info_level = "严重"
elif level >=4:
info_level = "中等"
else:
info_level = "轻微"
if alert_status:
print(f"警报: {alert_st}")
alert = server.alert(int(time.time()), alert_st, info_level)
alert = HookMocker(alert, "http://10.128.48.48:5000/api/osshook")
alert.start(width=1280, height=720, fps=30)
for f in buffered_frame:
alert.provide_frame(f)
alert.end()
alert_status = False
alert_st = ""
buffered_frame = []
level = 0
except queue.Empty:
continue
except Exception as e:
print(f"[Alert] 错误: {e}")
continue
def draw_debug_info(frame, result):