实现精细化人脸识别功能,人脸交互详细, UI部分还需要优化
This commit is contained in:
@ -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}
|
||||
|
||||
Reference in New Issue
Block a user