alert finish

This commit is contained in:
邓智航
2026-02-28 18:11:03 +08:00
parent 26ff511ddc
commit fd4d180eb1
4 changed files with 217 additions and 24 deletions

View File

@@ -14,9 +14,7 @@ from analyzer import MonitorSystem
from webrtc_server import WebRTCServer
from HeartRateMonitor import HeartRateMonitor
SERVER_HOST = "10.128.50.6"
SERVER_PORT = 65432
API_URL = "http://10.128.50.6:5000/api/states"
API_URL = "http://10.128.48.48:5000/api/states"
CAMERA_ID = 5
BASIC_FACE_DB = {
@@ -122,10 +120,11 @@ def analysis_thread():
if ana_video_queue.full():
ana_video_queue.get_nowait()
ana_video_queue.put(result["frame"])
# print(f"[Analysis] {time.strftime('%Y-%m-%d %H:%M:%S')} - Frame processed")
payload = {
"seat_id": CAMERA_ID,
"timestamp": int(time.time()),
"timestamp": time.time(),
"heart_rate": 0,
"emo_v": 0,
"emo_a": 0,
@@ -142,7 +141,7 @@ def analysis_thread():
front_data = {
"seat_id": CAMERA_ID,
"timestamp": int(time.time()),
"timestamp": time.time(),
"label": "",
"eye_close_freq": 0.0,
"iris_ratio_x": 0,
@@ -241,13 +240,10 @@ def analysis_thread():
print("[Analysis] 分析线程结束")
def video_stream_thread():
def video_stream_thread(server):
"""
发送线程:优化了 Socket 设置和压缩参数
"""
print(f"[Video] 准备连接服务器 {SERVER_HOST}:{SERVER_PORT} ...")
server = WebRTCServer(60, 5, "ws://10.128.50.6:5000")
server.start()
fourcc = cv2.VideoWriter_fourcc(*'avc1')
# # jetson-nvenc 编码器
# # -----------------------------------------------------------
@@ -419,7 +415,7 @@ def data_upload_thread():
print("[Data] 数据上报线程结束")
def alert_thread():
def alert_thread(server):
last_record_time = time.time()
file_id = 0
@@ -442,16 +438,17 @@ def alert_thread():
"no_face_time": "长时间无人脸,存在离岗或睡岗可能性",
}
fourcc1 = cv2.VideoWriter_fourcc(*'avc1')
alert_out = cv2.VideoWriter(VIDEO_FILE[file_id], fourcc1, 30.0, (1280, 720))
buffered_frame = []
alert_time = time.time()
emo_time = time.time()
alert_status = False
alert_st = ""
level = 0
while not stop_event.is_set():
frame = ana_video_queue.get(timeout=1)
alert_out.write(frame)
buffered_frame.append(frame)
now = time.time()
alert_status = False
alert_st = ""
data = None
if now - alert_time >= 1:
data = ana_data_queue.get(timeout=1)
@@ -492,41 +489,64 @@ def alert_thread():
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 - last_record_time >= 60:
file_id^= 1
alert_out.release()
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"] + ";"
haqian_time = 0
level += 1
if heart_spe < 60 or heart_spe > 120:
alert_status = True
alert_st += alert_info["heart_spe"] + ";"
heart_spe = 0
level += 1
if eye_close:
alert_status = True
alert_st += alert_info["eye_close"] + ";"
eye_close = False
level += 1
#TODO: 发送警报
alert_out = cv2.VideoWriter(VIDEO_FILE[file_id], fourcc1, 30.0, (1280, 720))
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
def draw_debug_info(frame, result):
@@ -616,15 +636,19 @@ def draw_debug_info(frame, result):
if __name__ == "__main__":
server = WebRTCServer(60, 5, "ws://10.128.48.48:5000")
server.start()
t1 = threading.Thread(target=capture_thread, daemon=True)
t2 = threading.Thread(target=analysis_thread, daemon=True)
t3 = threading.Thread(target=video_stream_thread, daemon=True)
t3 = threading.Thread(target=video_stream_thread, daemon=True, args=(server,))
t4 = threading.Thread(target=data_upload_thread, daemon=True)
t5 = threading.Thread(target=alert_thread, daemon=True, args=(server,))
t1.start()
t2.start()
t3.start()
t4.start()
t5.start()
try:
while not stop_event.is_set():
@@ -649,3 +673,4 @@ if __name__ == "__main__":
t2.join()
t3.join()
t4.join()
t5.join()