zoukankan      html  css  js  c++  java
  • python3+虹软2.0 离线人脸识别 demo

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

    虹软SDK下载戳这里

    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:pythonTestFacelibX64libarcsoft_face.dll')
    dll=CDLL('d:pythonTestFacelibX64libarcsoft_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])
    
    
     


  • 相关阅读:
    求解整数集合的交集(腾讯笔试)
    关于屏幕适配之比例布局
    (转)注册JNI函数的两种方式
    正则表达式记录
    当年一个简单可用的多线程断点续传类
    最近用到的几个工具方法
    Android中包含List成员变量的Parcel以及Parcel嵌套写法示例
    java实现计算MD5
    一个用于去除状态栏和虚拟导航栏的BaseActivity
    MVP的模板
  • 原文地址:https://www.cnblogs.com/Zzz-/p/10494187.html
Copyright © 2011-2022 走看看