实现精细化人脸识别功能,人脸交互详细, UI部分还需要优化

This commit is contained in:
冯佳
2025-09-15 16:03:17 +08:00
parent babab70845
commit 7205a21a8d
6 changed files with 220 additions and 124 deletions

View File

@ -78,7 +78,7 @@ CMD_NAMES = {
CMD_VERIFY: "人脸验证",
CMD_LED_CONTROL: "LED控制",
CMD_ENROLL: "人脸录入(多帧)",
CMD_ENROLL_SINGLE: "人脸录入(单帧)",
CMD_ENROLL_SINGLE: "人脸录入",
CMD_ENROLL_ITG: "人脸录入(集成式)",
CMD_DELETE_USER: "删除单个用户",
CMD_DELETE_ALL: "删除所有用户",
@ -104,7 +104,7 @@ RESULT_NAMES = {
0x09: "失败:超过最大用户数",
0x0A: "失败:已录入该用户",
0x0C: "失败:活体检测未通过",
0x0D: "失败:超时",
0x0D: "失败:人脸超时",
0x0E: "失败:认证失败",
0x13: "失败:文件读取错误",
0x14: "失败:文件写入错误",
@ -372,34 +372,105 @@ def parse_reply(data: bytes) -> dict:
# 自动生成提示消息
if info["ok"]:
if mid == CMD_VERIFY and "user_id" in info:
if mid == CMD_VERIFY:
info["message"] = (
f"{info['mid_name']} 成功 - 用户ID: {info['user_id']}"
)
pass
if mid == CMD_FACE_VIEW or mid == CMD_UVC_VIEW:
info["message"] = f"{info['mid_name']} 成功"
pass
else:
info["message"] = f"{info['mid_name']} 成功"
inform_box : DialogInform = DialogInform()
inform_box.information(f"{info['mid_name']}", f"{info['mid_name']}成功")
else:
info["message"] = f"{info['mid_name']} 失败: {info['result_name']}"
inform_box : DialogInform = DialogInform()
inform_box.information(f"{info['mid_name']}", f"{info['result_name']} ")
return info
def parse_note(data: bytes) -> dict:
"""
NOTE 消息解析:
- 保留工程信息(方便调试)
- 提供用户可读提示(仅在已知状态下提示)
"""
if len(data) < 1:
return {"type":"NOTE","error":"short"}
return {"type": "NOTE", "error": "short"}
nid = data[0]
rest = data[1:]
info = {"type":"NOTE","nid": nid, "nid_name": NOTE_NAMES.get(nid, f"0x{nid:02X}")}
info = {
"type": "NOTE",
"nid": nid,
"nid_name": NOTE_NAMES.get(nid, f"0x{nid:02X}")
}
user_message = None
# ---------- 人脸状态 ----------
if nid == NID_FACE_STATE and len(rest) >= 16:
vals = struct.unpack(">hhhhhhhh", rest[:16])
# state 用 1 个字节就够,第二个字节是保留/扩展
state = rest[0]
sub_state = rest[1]
left = int.from_bytes(rest[2:4], "big", signed=True)
top = int.from_bytes(rest[4:6], "big", signed=True)
right = int.from_bytes(rest[6:8], "big", signed=True)
bottom = int.from_bytes(rest[8:10], "big", signed=True)
yaw = int.from_bytes(rest[10:12], "big", signed=True)
pitch = int.from_bytes(rest[12:14], "big", signed=True)
roll = int.from_bytes(rest[14:16], "big", signed=True)
info.update({
"state": vals[0],
"left": vals[1], "top": vals[2], "right": vals[3], "bottom": vals[4],
"yaw": vals[5], "pitch": vals[6], "roll": vals[7]
"state": state,
"sub_state": sub_state,
"left": left, "top": top, "right": right, "bottom": bottom,
"yaw": yaw, "pitch": pitch, "roll": roll
})
# 只处理已知状态
state_messages = {
0: "人脸检测正常,请保持姿势",
1: "未检测到人脸,请面对摄像头",
6: "请靠近摄像头",
7: "请稍微远离摄像头",
8: "检测到遮挡,请移开遮挡物",
9: "请正对摄像头",
}
if state in state_messages:
user_message = state_messages[state]
# 如果是正常状态,可以补充角度提示
if state == 0:
if yaw > 15:
user_message += "(请把头向左转一些)"
elif yaw < -15:
user_message += "(请把头向右转一些)"
elif pitch > 15:
user_message += "(请抬起头)"
elif pitch < -15:
user_message += "(请低下头)"
# ---------- 其他 NOTE ----------
elif nid == NID_READY:
user_message = "设备已就绪,可以开始人脸识别"
elif nid == NID_UNKNOWNERROR:
user_message = "发生未知错误,请重试"
elif nid == NID_OTA_DONE:
user_message = "升级完成,请重启设备"
elif nid == NID_EYE_STATE:
user_message = "检测到眼睛状态变化"
if user_message:
info["user_message"] = user_message
return info
def parse_image(data: bytes) -> dict:
return {"type":"IMAGE","jpeg":data}