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.

209 lines
6.9 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.

import sys
from ctypes import *
from typing import List
platform = sys.platform
if platform == "win32":
dllc = cdll.msvcrt
elif platform == "linux":
dllc = CDLL("libc.so.6")
else:
raise Exception("Unsupported operating platform={}".format(platform))
# 激活文件信息
class ASF_ActiveFileInfo(Structure):
startTime: bytes
endTime: bytes
platform: bytes
sdkType: bytes
appId: bytes
sdkKey: bytes
sdkVersion: bytes
fileVersion: bytes
_fields_ = [('startTime', c_char_p), # SDK开始时间
('endTime', c_char_p), # SDK截止时间
('platform', c_char_p), # 平台版本
('sdkType', c_char_p), # SDK 类型
('appId', c_char_p), # APPID
('sdkKey', c_char_p), # SDKKEY
('sdkVersion', c_char_p), # SDK 版本号
('fileVersion', c_char_p) # 激活文件版本号
]
def __str__(self):
return "ASF_ActiveFileInfo(startTime={},endTime={},platform={},sdkType={},appId={},sdkKey={},sdkVersion={},fileVersion={})" \
.format(self.startTime, self.endTime, self.platform, self.sdkType, self.appId, self.sdkKey, self.sdkVersion,
self.fileVersion)
# 人脸框 信息
class MRECT(Structure):
left: int
top: int
right: int
bottom: int
_fields_ = [('left', c_int32),
('top', c_int32),
('right', c_int32),
('bottom', c_int32)]
def __repr__(self):
return self.__str__()
def __str__(self):
return "MRECT(top={},left={},right={},bottom={})".format(self.top, self.left, self.right, self.bottom)
# 单人脸信息
class ASF_SingleFaceInfo(Structure):
faceRect: List[MRECT]
faceOrient: int
_fields_ = [('faceRect', MRECT), # 人脸框
('faceOrient', c_int32) # 人脸角度
]
def __str__(self):
return "ASF_SingleFaceInfo(faceRect={}faceOrient={})".format(self.faceRect, self.faceOrient)
# 多人脸信息
class ASF_MultiFaceInfo(Structure):
faceRect: List[MRECT]
faceOrient: List[int]
faceNum: int
faceID: List[int]
_fields_ = [('faceRect', POINTER(MRECT)), # 人脸框数组
('faceOrient', POINTER(c_int32)), # 人脸角度数组
('faceNum', c_int32), # 检测到的人脸个数
('faceID', POINTER(c_int32)) # 在 VIDEO 模式下有效IMAGE 模式下为空
]
def __str__(self):
faceRect = []
faceOrient = []
faceID = []
for i in range(self.faceNum):
faceRect.append(self.faceRect[i])
faceOrient.append(self.faceOrient[i])
if self.faceID: # VIDEO模式下faceID为空
faceID.append(self.faceID[i])
return "ASF_MultiFaceInfo(faceNum={},faceID={},faceOrient={},faceRect={})".format(self.faceNum, faceID,
faceOrient, faceRect)
# 人脸特征信息
class ASF_FaceFeature(Structure):
feature: bytes
featureSize: int
_fields_ = [('feature', c_void_p), # 人脸特征
('featureSize', c_int32) # 人脸特征长度
]
def set_feature(self, feature: bytes, featureSize=1032):
"""
设置 特征值对象
:param feature: 对象的二进制内容
:param featureSize: 二进制长度
:return: None
"""
self.featureSize = featureSize
self.feature = dllc.malloc(featureSize)
dllc.memcpy(self.feature, feature, featureSize)
def get_feature_bytes(self):
return string_at(self.feature, self.featureSize)
def __str__(self):
return ("ASF_FaceFeature(featureSize={} feature={})".format(self.featureSize,
string_at(self.feature, self.featureSize)))
# 年龄信息
class ASF_AgeInfo(Structure):
ageArray: List[int]
num: int
_fields_ = [('ageArray', POINTER(c_int32)), # 0:未知; >0:年龄
('num', c_int32) # 检测的人脸个数
]
def __str__(self):
if self.num:
return "ASF_AgeInfo(num={},ageArray={})".format(self.num, [self.ageArray[i] for i in range(self.num)])
else:
return "ASF_AgeInfo(num={},ageArray={})".format(self.num, None)
# 性别信息
class ASF_GenderInfo(Structure):
genderArray: List[int]
num: int
_fields_ = [('genderArray', POINTER(c_int32)), # 0:男性; 1:女性; -1:未知
('num', c_int32) # 检测的人脸个数
]
def __str__(self):
if self.num:
return "ASF_GenderInfo(num={},genderArray={})".format(self.num,
[self.genderArray[i] for i in range(self.num)])
else:
return "ASF_GenderInfo(num={},genderArray={})".format(self.num, None)
# 3D角度信息
class ASF_Face3DAngle(Structure):
roll: List[float]
yaw: List[float]
pitch: List[float]
status: List[int]
num: int
_fields_ = [('roll', POINTER(c_float)), # 横滚角
('yaw', POINTER(c_float)), # 偏航角
('pitch', POINTER(c_float)), # 俯仰角
('status', POINTER(c_int32)), # 0:正常; 非 0:异常
('num', c_int32) # 检测的人脸个数
]
def __str__(self):
status = []
roll = []
yaw = []
pitch = []
for i in range(self.num):
status.append(self.status[i])
roll.append(self.roll[i])
yaw.append(self.yaw[i])
pitch.append(self.pitch[i])
return "ASF_Face3DAngle(num={} status{},roll={},yaw{},pitch{})".format(self.num, status, roll, yaw, pitch)
# 活体信息
class ASF_LivenessInfo(Structure):
isLive: List[int]
num: int
_fields_ = [('isLive', POINTER(c_int32)), # 0:非真人1:真人;-1不确定-2:传入人脸数>1
('num', c_int32) # 检测的人脸个数
]
def __str__(self):
if self.num:
return "ASF_LivenessInfo(num={},isLive={})".format(self.num, [self.isLive[0]])
else:
return "ASF_LivenessInfo(num={},isLive={})".format(self.num, None)
# 活体置信度
class ASF_LivenessThreshold(Structure):
thresholdmodel_BGR: float
thresholdmodel_IR: float
_fields_ = [('thresholdmodel_BGR', c_float), # 0:非真人1:真人;-1不确定-2:传入人脸数>1
('thresholdmodel_IR', c_float) # 检测的人脸个数
]
def __str__(self):
return "ASF_LivenessThreshold(thresholdmodel_BGR={},thresholdmodel_IR={})".format(self.thresholdmodel_BGR,
self.thresholdmodel_IR)