这一版,对虹软的功能进行了一些封装,添加了人脸特征比对,比对结果保存到文件,和从文件提取特征进行比对,大体功能基本都已经实现,可以进行下一步的应用开发了
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])
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年11月17日
2024年11月17日
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】