You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
8.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from arcsoft import lib_func
from arcsoft.struct_info import *
MOK = 0 # 函数调用成功状态码
MERR_ASF_ALREADY_ACTIVATED = 90114 # 已激活状态返回码
ASF_NONE = 0x00000000 # 无属性
ASF_FACE_DETECT = 0x00000001 # 此处detect可以是tracking或者detection两个引擎之一具体的选择由detect mode 确定
ASF_FACERECOGNITION = 0x00000004 # 人脸特征
ASF_AGE = 0x00000008 # 年龄
ASF_GENDER = 0x00000010 # 性别
ASF_FACE3DANGLE = 0x00000020 # 3D角度
ASF_LIVENESS = 0x00000080 # RGB活体
ASF_IR_LIVENESS = 0x00000400 # 红外活体
ASF_DETECT_MODE_VIDEO = 0x00000000 # Video模式一般用于多帧连续检测
ASF_DETECT_MODE_IMAGE = 0xFFFFFFFF # Image模式一般用于静态图的单次检测
ASVL_PAF_RGB24_B8G8R8 = 0x201 # RGB24位图bgr格式(opencv 读取图像的默认格式)
ASVL_PAF_GRAY = 0x701 # 灰度图
# 人脸检测方向
ASF_OP_0_ONLY = 0x1 # 仅检测 0 度
ASF_OP_90_ONLY = 0x2 # 仅检测 90 度
ASF_OP_270_ONLY = 0x3 # 仅检测 270 度
ASF_OP_180_ONLY = 0x4 # 仅检测 180 度
ASF_OP_0_HIGHER_EXT = 0x5 # 全角度检测
# 检测到的人脸角度
ASF_OC_0 = 0x1 # 0 度
ASF_OC_90 = 0x2 # 90 度
ASF_OC_270 = 0x3 # 270 度
ASF_OC_180 = 0x4 # 180 度
ASF_OC_30 = 0x5 # 30 度
ASF_OC_60 = 0x6 # 60 度
ASF_OC_120 = 0x7 # 120 度
ASF_OC_150 = 0x8 # 150 度
ASF_OC_210 = 0x9 # 210 度
ASF_OC_240 = 0xa # 240 度
ASF_OC_300 = 0xb # 300 度
ASF_OC_330 = 0xc # 330 度
def ASFOnlineActivation(Appkey, SDKey):
"""
在线激活 SDK
:param Appkey: 官网获取的 APPID
:param SDKey: 官网获取的 SDKKEY
:return: 状态码
"""
res = lib_func.ASFOnlineActivation(Appkey, SDKey)
if res != 90114 and res != 0:
print("激活失败!错误码:{}".format(res))
return res
def ASFGetActiveFileInfo():
"""
获取激活文件信息
:return: 状态码, 激活文件信息
"""
activeFileInfo = ASF_ActiveFileInfo()
return lib_func.ASFGetActiveFileInfo(byref(activeFileInfo)), activeFileInfo
class ArcFace():
def __init__(self):
self.Handle = c_void_p() # 引擎指针对象
def ASFInitEngine(self, detectMode: int, detectFaceOrientPriority: int, detectFaceScaleVal: int,
detectFaceMaxNum: int, combinedMask: int):
"""
初始化引擎
:param detectMode: VIDEO 模式/IMAGE 模式 ,VIDEO 模式:处理连续帧的图像数据 IMAGE 模式:处理单张的图像数据
:param detectFaceOrientPriority: 人脸检测角度推荐单一角度检测IMAGE 模式下不支持全角度ASF_OP_0_HIGHER_EXT检测
:param detectFaceScaleVal: 识别的最小人脸比例(图片长边与人脸框长边的比值),VIDEO 模式取值范围[2,32],推荐值为 16 ,IMAGE 模式取值范围[2,32],推荐值为 30
:param detectFaceMaxNum: 最大需要检测的人脸个数,取值范围[1,50]
:param combinedMask: 需要启用的功能组合,可多选
:return: 状态码
"""
return lib_func.ASFInitEngine(detectMode, detectFaceOrientPriority, detectFaceScaleVal, detectFaceMaxNum,
combinedMask, byref(self.Handle))
def ASFDetectFaces(self, frame):
"""
人脸检测
:param frame: 原始图像:注意:图片宽度必须 为 4 的倍数
:return: 状态码,人脸检测信息
"""
height, width = frame.shape[:2]
detectedFaces = ASF_MultiFaceInfo()
res = lib_func.ASFDetectFaces(self.Handle, int(width), int(height), ASVL_PAF_RGB24_B8G8R8,
frame.ctypes.data_as(POINTER(c_ubyte)), byref(detectedFaces))
return res, detectedFaces
def ASFProcess_IR(self, frame, detectedFaces, processIRMask=ASF_IR_LIVENESS):
"""
:param frame: 原始图像:注意:图片宽度必须 为 4 的倍数
:param detectedFaces: 多人脸检测信息对象
:param processIRMask: 当前只有ASF_IR_LIVENESS 一种选择
注:检测的属性须在引擎初始化接口的 combinedMask 参 数中启用
:return:
"""
height, width = frame.shape[:2]
res = lib_func.ASFProcess_IR(self.Handle, int(width), int(height), ASVL_PAF_GRAY,
frame.ctypes.data_as(POINTER(c_ubyte)), byref(detectedFaces), processIRMask)
return res
def ASFFaceFeatureExtract(self, frame, singleFaceInfo: ASF_SingleFaceInfo):
"""
人脸特征提取
:param frame: 原始图像:注意:图片宽度必须 为 4 的倍数
:param singleFaceInfo: 单个人脸检测框信息
:return: 状态码,人脸检测信息
"""
height, width = frame.shape[:2]
face_feature = ASF_FaceFeature()
res = lib_func.ASFFaceFeatureExtract(self.Handle, int(width), int(height), ASVL_PAF_RGB24_B8G8R8,
frame.ctypes.data_as(POINTER(c_ubyte)), singleFaceInfo,
byref(face_feature))
copy_face_feature = ASF_FaceFeature()
copy_face_feature.featureSize = face_feature.featureSize
copy_face_feature.feature = lib_func.malloc(face_feature.featureSize)
lib_func.memcpy(copy_face_feature.feature, face_feature.feature, face_feature.featureSize)
return res, copy_face_feature
def ASFFaceFeatureCompare(self, face_feature1: ASF_FaceFeature, face_feature2: ASF_FaceFeature):
"""
人脸特征比较
:param face_feature1: 特征对象1
:param face_feature2: 特征对象2
:return: 状态码,人脸得分
"""
compare_score = c_float()
ret = lib_func.ASFFaceFeatureCompare(self.Handle, face_feature1, face_feature2, byref(compare_score))
return ret, compare_score.value
def ASFProcess(self, frame, detectedFaces: ASF_MultiFaceInfo, combinedMask: int):
"""
人脸信息检测(年龄/性别/人脸 3D 角度/rgb活体最多支持 4 张人脸信息检测,超过部分返回未知(活体仅支持单张人脸检测,超出返回未知)
:param frame: 原始图像:注意:图片宽度必须 为 4 的倍数
:param detectedFaces: 多人脸检测信息对象
:param combinedMask: 检测的属性ASF_AGE、ASF_GENDER、ASF_FACE3DANGLE、ASF_LIVENESS支持多选
注:检测的属性须在引擎初始化接口的 combinedMask 参 数中启用
:return:
"""
height, width = frame.shape[:2]
res = lib_func.ASFProcess(self.Handle, int(width), int(height), ASVL_PAF_RGB24_B8G8R8,
frame.ctypes.data_as(POINTER(c_ubyte)),
byref(detectedFaces), combinedMask)
return res
def ASFGetFace3DAngle(self):
"""
获取 3D 角度信息
:return: 状态码人脸3d角度信息
"""
angleInfo = ASF_Face3DAngle()
res = lib_func.ASFGetFace3DAngle(self.Handle, angleInfo)
return res, angleInfo
def ASFGetLivenessScore(self):
"""
获取 RGB 活体信息
:return:状态码RGB 活体信息
"""
rgbLivenessInfo = ASF_LivenessInfo()
res = lib_func.ASFGetLivenessScore(self.Handle, byref(rgbLivenessInfo))
return res, rgbLivenessInfo
def ASFGetAge(self):
"""
获取年龄信息
:return: :状态码,年龄信息
"""
ageInfo = ASF_AgeInfo()
res = lib_func.ASFGetAge(self.Handle, byref(ageInfo))
return res, ageInfo
def ASFGetGender(self):
"""
获取性别信息
:return:状态码,性别信息
"""
genderInfo = ASF_GenderInfo()
res = lib_func.ASFGetGender(self.Handle, byref(genderInfo))
return res, genderInfo
def ASFGetLivenessScore_IR(self):
"""
获取IR识别结果
:return:状态码IR识别结果
"""
irLivenessInfo = ASF_LivenessInfo()
res = lib_func.ASFGetLivenessScore_IR(self.Handle, byref(irLivenessInfo))
return res, irLivenessInfo
def ASFSetLivenessParam(self, threshold: ASF_LivenessThreshold):
"""
设置活体检测置信度
:return:
"""
return lib_func.ASFSetLivenessParam(self.Handle, threshold)
def ASFUninitEngine(self):
"""
销毁引擎
:return: 状态码
"""
return lib_func.ASFUninitEngine(self.Handle)
# 从二进制数据获取特征值
def ASFGetFeatureFromBinary(self, binaryValue):
face_feature = ASF_FaceFeature()
b = binaryValue
face_feature.featureSize = b.__len__()
face_feature.feature = lib_func.malloc(face_feature.featureSize)
lib_func.memcpy(face_feature.feature, b, face_feature.featureSize)
return face_feature