欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python3+arcface2.0 离线人脸识别 demo

程序员文章站 2022-05-17 16:42:55
python3+虹软2.0的所有功能整合测试完成,并对虹软所有功能进行了封装,现提供demo主要功能,1.人脸识别2.人脸特征提取3.特征比对4.特征数据存储与比对其他特征没有添加 sdk 下载请戳这里 face_class.py face_dll.py face_function.py Main1 ......

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])
复制代码