python调用虹软2.0第三版
这一版,对虹软的功能进行了一些封装,添加了人脸特征比对,比对结果保存到文件,和从文件提取特征进行比对,大体功能基本都已经实现,可以进行下一步的应用开发了
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])
python调用虹软2.0第三版的更多相关文章
- python调用虹软2.0(全网首发)-更新中
python调用虹软2.0目前没有任何demo可以参考,自己研究了2个晚上终于把第一步做出来了,使用了opencv来加载和显示图片,龟速更新中 这一版作废,新版已发出:https://www.cnbl ...
- python调用虹软2.0第二版
第一版踩了无数的坑,终于第二版把坑全添了,这次更新可以正常获取人脸数,角度,代码可读性更高,继续更新中 第三版已发出 https://www.cnblogs.com/wxt51/p/10125460. ...
- python调用虹软2.0
第一版踩了无数的坑,终于第二版把坑全添了,这次更新可以正常获取人脸数,角度,代码可读性更高,继续更新中 第三版已发出 https://www.cnblogs.com/wxt51/p/10125460. ...
- Python调用ansible API系列(三)带有callback的执行adhoc和playbook
在第二篇文章中虽然可以执行adhoc和playbook但是执行结果的输出并不是特别直观,虽然没有报错但是到底什么结果其实你是不知道的尤其是在执行adhoc的时候,这时候我们要利用callback来设置 ...
- python全栈开放实践第三版第一章的练习题完成情况
练习题: 1.简述编译型与解释型语言的区别,且分别列出你知道哪些语言属于编译型,哪些数以解释型.1 编译型:只须编译一次就可以把源代码编译成机器语言,后面的执行无须重新编译,直接使用之前的编译结果就可 ...
- Python调用C/C++程序
编程中会遇到调用其他语言到库,这里记录一下Python调用C++. Python底层是C, 所以调用C还是比较方便.调用C++有些麻烦. Python提供了ctypes, 方便将Python类型转为C ...
- Python黑帽编程3.0 第三章 网络接口层攻击基础知识
3.0 第三章 网络接口层攻击基础知识 首先还是要提醒各位同学,在学习本章之前,请认真的学习TCP/IP体系结构的相关知识,本系列教程在这方面只会浅尝辄止. 本节简单概述下OSI七层模型和TCP/IP ...
- selenium webdriver (python) 第三版
感谢 感谢购买第二版的同学,谢谢你们对本人劳动成果的支持!也正是你们时常问我还出不出第三版了,也是你们的鼓励,让我继续学习整理本文档. 感谢乙醇前辈,第二版的文档是放在他的淘宝网站上卖的,感谢他的帮忙 ...
- 笨办法学 Python (第三版)(转载)
笨办法学 Python (第三版) 原文地址:http://blog.sina.com.cn/s/blog_72b8298001019xg8.html 摘自https://learn-python ...
随机推荐
- iOS 开发笔记-Storyboard
什么时候用Pust,什么时候用Modal? 一般情况下,是导航控制器点过去的,都使用Pust.如果是相对独立的,则用Modal,比如是导航上面的+添加之类. 关闭一个Modal -(IBAction) ...
- Java编写验证码
Java后台代码(CheckCodeServlet.java) package web; import java.awt.Color; import java.awt.Font; import jav ...
- Django初级手册6-静态文件
用Django加载外部文件 在Django中iamges,JS或者CSS通称为static文件 定制APP的外观 一般放在应用目录下的static/polls/目录下,下为polls/static/p ...
- Fenwick
hdu1394 这题说的是给了一个序列计算这个序列的逆序对总共要进行n次 每次都将目前的第一个放到序列的最后一个位置然后 计算一次逆序对 这样我们只需要先求一次逆序对 然后接着每次都用F=F+(n-T ...
- linux常用命令:chkconfig 命令
chkconfig命令用来安装,查看或修改 services随系统启动的启动选项的设置.是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各 ...
- Qt学习之路(45): 自定义model之一
前面我们说了Qt提供的几个预定义model.但是,面对变化万千的需求,那几个model是远远不能满足我们的需要的.另外,对于Qt这种框架来说,model的选择首先要能满足绝大多数功能的需要,这就是说, ...
- oracle中验证身份证是否合法的函数脚本
--创建函数 入参是身份证 返回1 合法 0不合法 CREATE OR REPLACE FUNCTION fn_checkidcard (p_idcard IN VARCHAR2) RETURN ...
- 出现“基础链接已关闭,无法链接到远程服务器"错误的解决办法
一些用户在安装一些软件或是系统做某些修改后,采集器就没无登录或是无法获取到网页.登录或是使用httppostget工具会出现 ”基础链接已关闭,无法链接到远程服务器“的提示.经分析,是系统Socket ...
- SmartOS之以太网精简协议栈TinyIP
做物联网,没有以太网怎么能行!基于Enc28j60,我们团队独立实现了以太网精简协议栈TinyIP,目前支持ARP/ICMP/TCP/UDP/DHCP,还缺一个DNS就完整了.TinyIP内置一个数据 ...
- linux中线程池【转】
本文转载自:http://blog.csdn.net/yusiguyuan/article/details/18401277 一.线程池 大多数的网络服务器,包括Web服务器都具有一个特点,就是单位时 ...