共计 5245 个字符,预计需要花费 14 分钟才能阅读完成。
python3+ 虹软 2.0 的所有功能整合测试完成, 并对虹软所有功能进行了封装, 现提供 demo 主要功能,1. 人脸识别 2. 人脸特征提取 3. 特征比对 4. 特征数据存储与比对其他特征没有添加
face_class.py
复制代码
from ctypes import *
#人脸框
class MRECT(Structure):
_fields_=[(u’left1′,c_int32),(u’top1′,c_int32),(u’right1′,c_int32),(u’bottom1′,c_int32)]
#版本信息 版本号, 构建日期, 版权说明
class ASF_VERSION(Structure):
_fields_=[(‘Version’,c_char_p),(‘BuildDate’,c_char_p),(‘CopyRight’,c_char_p)]
#单人人脸信息 人脸狂, 人脸角度
class ASF_SingleFaceInfo(Structure):
_fields_=[(‘faceRect’,MRECT),(‘faceOrient’,c_int32)]
#多人人脸信息 人脸框数组, 人脸角度数组, 人脸数
class ASF_MultiFaceInfo(Structure):
# _fields_=[(‘faceRect’,POINTER(MRECT)),(‘faceOrient’,POINTER( c_int32)),(‘faceNum’,c_int32)]
_fields_=[(u’faceRect’,POINTER(MRECT)),(u’faceOrient’,POINTER(c_int32)),(u’faceNum’, c_int32)]
# _fields_=[(u’faceRect’,MRECT*50),(u’faceOrient’,c_int32*50),(u’faceNum’,c_int32)]
#人脸特征 人脸特征, 人脸特征长度
class ASF_FaceFeature(Structure):
_fields_=[(‘feature’,c_void_p),(‘featureSize’,c_int32)]
#自定义图片类
class IM:
def __init__(self):
self.filepath=None
self.date=None
self.width=0
self.height=0
复制代码
face_dll.py
复制代码
from ctypes import *
from face_class import *
wuyongdll=CDLL(‘d:\python\Test\Face\lib\X64\libarcsoft_face.dll’)
dll=CDLL(‘d:\python\Test\Face\lib\X64\libarcsoft_face_engine.dll’)
dllc=cdll.msvcrt
ASF_DETECT_MODE_VIDEO = 0x00000000
ASF_DETECT_MODE_IMAGE = 0xFFFFFFFF
c_ubyte_p = POINTER(c_ubyte)
#激活
jihuo=dll.ASFActivation
jihuo.restype = c_int32
jihuo.argtypes = (c_char_p,c_char_p)
#初始化
chushihua=dll.ASFInitEngine
chushihua.restype=c_int32
chushihua.argtypes=(c_long,c_int32,c_int32,c_int32,c_int32,POINTER(c_void_p))
#人脸识别
shibie=dll.ASFDetectFaces
shibie.restype=c_int32
shibie.argtypes=(c_void_p,c_int32,c_int32,c_int32,POINTER(c_ubyte),POINTER(ASF_MultiFaceInfo))
#特征提取
tezheng=dll.ASFFaceFeatureExtract
tezheng.restype=c_int32
tezheng.argtypes=(c_void_p,c_int32,c_int32,c_int32,POINTER(c_ubyte),POINTER(ASF_SingleFaceInfo),POINTER(ASF_FaceFeature))
# 特征比对
bidui=dll.ASFFaceFeatureCompare
bidui.restype=c_int32
bidui.argtypes=(c_void_p,POINTER(ASF_FaceFeature),POINTER(ASF_FaceFeature),POINTER(c_float))
malloc = dllc.malloc
free = dllc.free
memcpy = dllc.memcpy
malloc.restype = c_void_p
malloc.argtypes = (c_size_t,)
free.restype = None
free.argtypes = (c_void_p,)
memcpy.restype = c_void_p
memcpy.argtypes = (c_void_p, c_void_p, c_size_t)
复制代码
face_function.py
复制代码
import face_dll,face_class
from ctypes import *
import cv2
from io import BytesIO
# from Main import *
Handle=c_void_p()
c_ubyte_p = POINTER(c_ubyte)
# 激活函数
def JH(appkey,sdkey):
ret=face_dll.jihuo(appkey,sdkey)
return ret
# 初始化函数
def CSH():# 1:视频或图片模式,2 角度,3 最小人脸尺寸推荐 16,4 最多人脸数最大 50,5 功能,6 返回激活句柄
ret=face_dll.chushihua(0xFFFFFFFF,0x1,16,50,5,byref(Handle))
# Main.Handle=Handle
return ret,Handle
# cv2 记载图片并处理
def LoadImg(im):
img=cv2.imread(im.filepath)
sp=img.shape
img=cv2.resize(img,(sp[1]//4*4,sp[0]//4*4))
sp=img.shape
im.data=img
im.width=sp[1]
im.height=sp[0]
return im
def RLSB(im):
faces=face_class.ASF_MultiFaceInfo()
img=im.data
imgby=bytes(im.data)
imgcuby=cast(imgby,c_ubyte_p)
ret=face_dll.shibie(Handle,im.width,im.height,0x201,imgcuby,byref(faces))
return ret,faces
# 显示人脸识别图片
def showimg(im,faces):
for i in range(0,faces.faceNum):
ra=faces.faceRect[i]
cv2.rectangle(im.data,(ra.left1,ra.top1),(ra.right1,ra.bottom1),(255,0,0,),2)
cv2.imshow(‘faces’,im.data)
cv2.waitKey(0)
#提取人脸特征
def RLTZ(im,ft):
detectedFaces=face_class.ASF_FaceFeature()
img=im.data
imgby=bytes(im.data)
imgcuby=cast(imgby,c_ubyte_p)
ret=face_dll.tezheng(Handle,im.width,im.height,0x201,imgcuby,ft,byref(detectedFaces))
if ret==0:
retz=face_class.ASF_FaceFeature()
retz.featureSize=detectedFaces.featureSize
#必须操作内存来保留特征值, 因为 c ++ 会在过程结束后自动释放内存
retz.feature=face_dll.malloc(detectedFaces.featureSize)
face_dll.memcpy(retz.feature,detectedFaces.feature,detectedFaces.featureSize)
# print(‘ 提取特征成功:’,detectedFaces.featureSize,mem)
return ret,retz
else:
return ret
#特征值比对, 返回比对结果
def BD(tz1,tz2):
jg=c_float()
ret=face_dll.bidui(Handle,tz1,tz2,byref(jg))
return ret,jg.value
#单人特征写入文件
def writeFTFile(feature,filepath):
f = BytesIO(string_at(feature.feature,feature.featureSize))
a=open(filepath,’wb’)
a.write(f.getvalue())
a.close()
#从多人中提取单人数据
def getsingleface(singleface,index):
ft=face_class.ASF_SingleFaceInfo()
ra=singleface.faceRect[index]
ft.faceRect.left1=ra.left1
ft.faceRect.right1=ra.right1
ft.faceRect.top1=ra.top1
ft.faceRect.bottom1=ra.bottom1
ft.faceOrient=singleface.faceOrient[index]
return ft
#从文件获取特征值
def ftfromfile(filepath):
fas=face_class.ASF_FaceFeature()
f=open(‘d:/1.dat’,’rb’)
b=f.read()
f.close()
fas.featureSize=b.__len__()
fas.feature=face_dll.malloc(fas.featureSize)
face_dll.memcpy(fas.feature,b,fas.featureSize)
return fas
复制代码
Main1.py
复制代码
import face_dll,face_class
from ctypes import *
import cv2
import face_function as fun
Appkey=b”
SDKey=b”
# 激活
ret=fun.JH(Appkey,SDKey)
if ret==0 or ret==90114:
print(‘ 激活成功:’,ret)
else:
print(‘ 激活失败:’,ret)
pass
# 初始化
ret=fun.CSH()
if ret[0]==0:
print(‘ 初始化成功:’,ret,’ 句柄 ’,fun.Handle)
else:
print(‘ 初始化失败:’,ret)
# 加载图片
im=face_class.IM()
im.filepath=’e:/2.jpg’
im=fun.LoadImg(im)
print(im.filepath,im.width,im.height)
# cv2.imshow(‘im’,im.data)
# cv2.waitKey(0)
print(‘ 加载图片完成:’,im)
ret=fun.RLSB(im)
if ret[0]==-1:
print(‘ 人脸识别失败:’,ret)
pass
else:
print(‘ 人脸识别成功:’,ret)
# 显示人脸照片
# showimg(im,ret)
#提取单人 1 特征
ft=fun.getsingleface(ret[1],0)
tz1=fun.RLTZ(im,ft)[1]
#提取单人 2 特征
ft=fun.getsingleface(ret[1],1)
tz2=fun.RLTZ(im,ft)[1]
#特征保存到文件
# fun.writeFTFile(tz1,’d:/1.dat’)
# fun.writeFTFile(tz2,’d:/2.dat’)
#文件获取特征
tz=fun.ftfromfile(‘d:/1.dat’)
jg=fun.BD(tz1,tz)
print(jg[1])
#结果比对
# jg=fun.BD(tz1,tz2)
# print(jg[1])
复制代码