python调用虹软2.0第三版的具体使用


Posted in Python onFebruary 22, 2019

这一版,对虹软的功能进行了一些封装,添加了人脸特征比对,比对结果保存到文件,和从文件提取特征进行比对,大体功能基本都已经实现,可以进行下一步的应用开发了

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 相关文章推荐
Python获取电脑硬件信息及状态的实现方法
Aug 29 Python
Python中在for循环中嵌套使用if和else语句的技巧
Jun 20 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
Apr 11 Python
python 信息同时输出到控制台与文件的实例讲解
May 11 Python
对python字典过滤条件的实例详解
Jan 22 Python
python实现的自动发送消息功能详解
Aug 15 Python
wxPython实现整点报时
Nov 18 Python
关于pandas的离散化,面元划分详解
Nov 22 Python
Python函数递归调用实现原理实例解析
Aug 11 Python
Python实现Kerberos用户的增删改查操作
Dec 14 Python
python爬虫scrapy框架的梨视频案例解析
Feb 20 Python
Python上下文管理器Content Manager
Jun 26 Python
Python实现图片转字符画的代码实例
Feb 22 #Python
Python中正则表达式的用法总结
Feb 22 #Python
python ddt数据驱动最简实例代码
Feb 22 #Python
Flask框架踩坑之ajax跨域请求实现
Feb 22 #Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 #Python
pandas修改DataFrame列名的实现方法
Feb 22 #Python
pyhanlp安装介绍和简单应用
Feb 22 #Python
You might like
php array_map()数组函数使用说明
2011/07/12 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
javascript AutoScroller 函数类
2009/05/29 Javascript
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
js截取小数点后几位的写法
2013/11/14 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
2017/06/20 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
Python操作mongodb的9个步骤
2018/06/04 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
python协程之动态添加任务的方法
2019/02/19 Python
Python Flask框架扩展操作示例
2019/05/03 Python
python对常见数据类型的遍历解析
2019/08/27 Python
Python Process多进程实现过程
2019/10/22 Python
python将时分秒转换成秒的实例
2019/12/07 Python
python的slice notation的特殊用法详解
2019/12/27 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
智乐游戏测试笔试题
2014/05/21 面试题
师范生实习的个人自我鉴定
2013/10/20 职场文书
装修致歉信
2014/01/15 职场文书
汽车机修工岗位职责
2014/03/06 职场文书
师范生见习报告范文
2014/11/03 职场文书
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
2021/04/01 PHP
Python通过m3u8文件下载合并ts视频的操作
2021/04/16 Python
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技