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

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

  • 相关阅读:
    eclipse下c/cpp " undefined reference to " or "launch failed binary not found"问题
    blockdev 设置文件预读大小
    宝宝语录
    CentOS修改主机名(hostname)
    subprocess报No such file or directory
    用ldap方式访问AD域的的错误解释
    英特尔的VTd技术是什么?
    This virtual machine requires the VMware keyboard support driver which is not installed
    Linux内核的文件预读详细详解
    UNP总结 Chapter 26~29 线程、IP选项、原始套接字、数据链路访问
  • 原文地址:https://www.cnblogs.com/KEAIILINN/p/10481285.html
Copyright © 2011-2022 走看看