博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python3+arcface2.0 离线人脸识别 demo
阅读量:5891 次
发布时间:2019-06-19

本文共 5804 字,大约阅读时间需要 19 分钟。

hot3.png

python3+虹软2.0的所有功能整合测试完成,并对虹软所有功能进行了封装,现提供demo 主要功能, 1.人脸识别 2.人脸特征提取 3.特征比对 4.特征数据存储与比对 其他特征没有添加

虹软SDK下载戳这里

face_class.pyfrom 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.msvcrtASF_DETECT_MODE_VIDEO = 0x00000000ASF_DETECT_MODE_IMAGE = 0xFFFFFFFFc_ubyte_p = POINTER(c_ubyte) #激活jihuo=dll.ASFActivationjihuo.restype = c_int32jihuo.argtypes = (c_char_p,c_char_p)#初始化chushihua=dll.ASFInitEnginechushihua.restype=c_int32chushihua.argtypes=(c_long,c_int32,c_int32,c_int32,c_int32,POINTER(c_void_p))#人脸识别shibie=dll.ASFDetectFacesshibie.restype=c_int32shibie.argtypes=(c_void_p,c_int32,c_int32,c_int32,POINTER(c_ubyte),POINTER(ASF_MultiFaceInfo))#特征提取tezheng=dll.ASFFaceFeatureExtracttezheng.restype=c_int32tezheng.argtypes=(c_void_p,c_int32,c_int32,c_int32,POINTER(c_ubyte),POINTER(ASF_SingleFaceInfo),POINTER(ASF_FaceFeature))#特征比对bidui=dll.ASFFaceFeatureComparebidui.restype=c_int32bidui.argtypes=(c_void_p,POINTER(ASF_FaceFeature),POINTER(ASF_FaceFeature),POINTER(c_float))malloc = dllc.mallocfree = dllc.freememcpy = dllc.memcpymalloc.restype = c_void_pmalloc.argtypes = (c_size_t, )free.restype = Nonefree.argtypes = (c_void_p, )memcpy.restype = c_void_pmemcpy.argtypes = (c_void_p, c_void_p, c_size_t)

face_function.py

import face_dll,face_classfrom ctypes import *import cv2from 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 imdef 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_classfrom ctypes import *import cv2import face_function as funAppkey=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)    passelse:    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])

转载于:https://my.oschina.net/u/3970172/blog/3029317

你可能感兴趣的文章
〖Android〗/system/etc/fallback_fonts.xml
查看>>
30个美丽干净的,帮助用户专注于内容的网站设计
查看>>
高级Bash脚本编程指南(27):文本处理命令(三)
查看>>
JavaScript---事件
查看>>
Android NDK入门实例 计算斐波那契数列一生成jni头文件
查看>>
c/c++性能优化--I/O优化(上)
查看>>
将HTML特殊转义为实体字符的两种实现方式
查看>>
jquery 保留两个小数的方法
查看>>
网站架构设计的误区
查看>>
Standard C++ Programming: Virtual Functions and Inlining
查看>>
html5 Web Workers
查看>>
iis 故障导致网站无法访问
查看>>
作业抄袭简单检测
查看>>
ASP.NET 回调技术(CallBack)
查看>>
Spark源码分析 – BlockManager
查看>>
JS中的this
查看>>
人生, 不要在别扭的事上纠结
查看>>
C的面向对象编程
查看>>
日志服务器架构设计
查看>>
使用Unity开发Android的几种调试方法
查看>>