diff --git a/service/face_service.py b/service/face_service.py index c554153..8c26af6 100644 --- a/service/face_service.py +++ b/service/face_service.py @@ -6,12 +6,16 @@ from schema.face_schema import FaceCreateRequest, FaceUpdateRequest, FaceRespons from schema.response_schema import APIResponse from middle.auth_middleware import get_current_user from schema.user_schema import UserResponse +from ocr.feature_extraction import BinaryFaceFeatureHandler router = APIRouter( prefix="/faces", tags=["人脸管理"] ) +# 创建 BinaryFaceFeatureHandler 的实例 +binary_face_feature_handler = BinaryFaceFeatureHandler() + # ------------------------------ # 1. 创建人脸记录(核心修正:ID 数据库自增,前端无需传) @@ -43,7 +47,6 @@ async def create_face( # 调用人脸识别得到特征值 - # 2. 插入数据库:无需传 ID(自增),只传 name 和 eigenvalue(None) insert_query = """ INSERT INTO face (name, eigenvalue) @@ -240,7 +243,7 @@ def get_all_face_name_with_eigenvalue() -> dict: """ 获取所有人脸的名称及其对应的特征值,组成字典返回 key: 人脸名称(name) - value: 人脸特征值(eigenvalue) + value: 人脸特征值(eigenvalue),若名称重复则返回平均特征值 注:过滤掉name为None的记录,避免字典key为None的情况 """ conn = None @@ -254,11 +257,25 @@ def get_all_face_name_with_eigenvalue() -> dict: cursor.execute(query) faces = cursor.fetchall() - # 构建name到eigenvalue的映射字典 - face_dict = { - face["name"]: face["eigenvalue"] - for face in faces - } + # 先收集所有名称对应的特征值列表(处理重复名称) + name_to_eigenvalues = {} + for face in faces: + name = face["name"] + eigenvalue = face["eigenvalue"] + if name in name_to_eigenvalues: + name_to_eigenvalues[name].append(eigenvalue) + else: + name_to_eigenvalues[name] = [eigenvalue] + + # 构建最终字典:重复名称取平均特征值,唯一名称直接取特征值 + face_dict = {} + for name, eigenvalues in name_to_eigenvalues.items(): + print("调用的特征值是:" + eigenvalues) + if len(eigenvalues) > 1: + # 调用平均特征值计算方法 + face_dict[name] = binary_face_feature_handler.get_average_feature(eigenvalues) + else: + face_dict[name] = eigenvalues[0] return face_dict @@ -266,4 +283,4 @@ def get_all_face_name_with_eigenvalue() -> dict: raise Exception(f"获取人脸名称与特征值失败:{str(e)}") from e finally: # 确保资源释放 - db.close_connection(conn, cursor) \ No newline at end of file + db.close_connection(conn, cursor)