实现精细化人脸识别功能,人脸交互详细, UI部分还需要优化
This commit is contained in:
@ -453,6 +453,7 @@ class QFaceCameraViewPage(PageTemplate):
|
||||
self.t_video.start()
|
||||
|
||||
self.face_verify_result = None # 用于存储人脸验证结果
|
||||
self.verify_in_progress = False # 标志当前是否有验证在进行中
|
||||
|
||||
self.auto_connect_serial()
|
||||
|
||||
@ -541,36 +542,104 @@ class QFaceCameraViewPage(PageTemplate):
|
||||
self.log("[WARN] 摄像头线程已停止")
|
||||
self.video_worker=None # 自动重连可在这里实现
|
||||
|
||||
# 帧处理
|
||||
def on_frame(self, fr: dict):
|
||||
self.log("< " + fr["raw"].hex(" "))
|
||||
"""
|
||||
接收到一帧数据后的处理
|
||||
"""
|
||||
raw_bytes = fr.get("raw", b"")
|
||||
self.log("< " + raw_bytes.hex(" "))
|
||||
|
||||
msg_id = fr.get("msg_id")
|
||||
data = fr.get("data", b"")
|
||||
|
||||
if msg_id == MID_REPLY:
|
||||
info = parse_reply(data)
|
||||
self.log(f"[REPLY] {info}")
|
||||
if info.get("mid") == CMD_ENROLL_ITG:
|
||||
if info.get("result") == 0x00:
|
||||
user_id = info.get("user_id")
|
||||
if user_id:
|
||||
if save_user(user_id):
|
||||
self.log(f"[INFO] 用户ID={user_id} 已保存")
|
||||
else:
|
||||
inform_box : DialogInform = DialogInform()
|
||||
inform_box.information("提示", f"用户ID {user_id} 已存在!")
|
||||
elif info.get("mid") == CMD_VERIFY :
|
||||
|
||||
if info.get("result") == 0x00:
|
||||
user_id = info.get("user_id")
|
||||
print(f"[INFO] 用户(ID={user_id}) 验证通过")
|
||||
self.face_verify_result = True
|
||||
else:
|
||||
self.face_verify_result = False
|
||||
mid = info.get("mid")
|
||||
result = info.get("result")
|
||||
|
||||
# 命令分发字典
|
||||
dispatch_reply = {
|
||||
CMD_ENROLL_SINGLE: self._handle_enroll_reply,
|
||||
CMD_VERIFY: self._handle_verify_reply,
|
||||
CMD_GET_ALL_USERID :self._handle_get_all_userid_reply,
|
||||
}
|
||||
|
||||
handler = dispatch_reply.get(mid)
|
||||
if handler:
|
||||
handler(info)
|
||||
|
||||
elif msg_id == MID_NOTE:
|
||||
info = parse_note(data)
|
||||
self.log(f"[NOTE] {info}")
|
||||
self._handle_note(info)
|
||||
|
||||
# ---------------- NOTE 处理 ----------------
|
||||
|
||||
def _handle_note(self, info: dict):
|
||||
"""
|
||||
处理 NOTE 消息,给用户交互提示
|
||||
"""
|
||||
user_message = info.get("user_message")
|
||||
nid = info.get("nid")
|
||||
|
||||
# 仅在验证进行中时提示 NOTE
|
||||
if getattr(self, "verify_in_progress", False):
|
||||
if user_message:
|
||||
DialogInform(self).information("提示", user_message)
|
||||
|
||||
# 日志记录(工程用)
|
||||
if nid == NID_FACE_STATE:
|
||||
state = info.get("state")
|
||||
self.log(f"[INFO] 人脸状态: {state}, yaw={info.get('yaw')}, pitch={info.get('pitch')}, roll={info.get('roll')}")
|
||||
elif nid == NID_READY:
|
||||
self.log("[INFO] 模组已就绪")
|
||||
elif nid == NID_OTA_DONE:
|
||||
self.log("[INFO] 固件升级完成")
|
||||
elif nid == NID_UNKNOWNERROR:
|
||||
self.log("[ERROR] 模组发生未知错误")
|
||||
|
||||
# ---------------- REPLY 处理 ----------------
|
||||
|
||||
def _handle_enroll_reply(self, info: dict):
|
||||
user_id = info.get("user_id")
|
||||
if info.get("result") == 0x00:
|
||||
if user_id:
|
||||
if save_user(user_id):
|
||||
self.refresh()
|
||||
self.log(f"[INFO] 用户ID={user_id} 已保存")
|
||||
else:
|
||||
DialogInform(self).information("提示", f"用户ID {user_id} 已存在!")
|
||||
else:
|
||||
self.log(f"[ERROR] 注册失败, 用户ID={user_id}")
|
||||
|
||||
def _handle_verify_reply(self, info: dict):
|
||||
"""
|
||||
验证结果处理
|
||||
"""
|
||||
user_id = info.get("user_id")
|
||||
result = info.get("result")
|
||||
|
||||
# 验证结束,状态机复位
|
||||
self.verify_in_progress = False
|
||||
|
||||
if result == 0x00:
|
||||
print(f"[INFO] 用户(ID={user_id}) 验证通过")
|
||||
self.face_verify_result = True
|
||||
else:
|
||||
print(f"[INFO] 用户(ID={user_id}) 验证失败")
|
||||
self.face_verify_result = False
|
||||
|
||||
def _handle_get_all_userid_reply(self, info: dict):
|
||||
count = info.get("count")
|
||||
result = info.get("result")
|
||||
user_ids = info.get("user_ids", [])
|
||||
if result == 0x00:
|
||||
DialogInform(self).information("提示", f"{count} 个用户\n用户ID 列表:" + ", ".join(map(str, user_ids)))
|
||||
|
||||
|
||||
|
||||
|
||||
# 日志
|
||||
def log(self, s: str):
|
||||
@ -595,8 +664,6 @@ class QFaceCameraViewPage(PageTemplate):
|
||||
self.close_serial()
|
||||
super().closeEvent(e)
|
||||
|
||||
|
||||
|
||||
#P06故障查询页面 QFaultQueryPage
|
||||
class QFaultQueryPage(PageTemplate):
|
||||
def __init__(self, parent_window):
|
||||
@ -774,7 +841,7 @@ class APPWindow(QMainWindow):
|
||||
|
||||
QFaceCameraViewPage.video_worker = None
|
||||
QFaceCameraViewPage.ser = None
|
||||
|
||||
|
||||
self.showFullScreen()
|
||||
|
||||
self.menu_sequence_list : PageTemplate = []
|
||||
|
||||
Reference in New Issue
Block a user