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实现的简单万年历例子分享
Apr 25 Python
实例讲解Python设计模式编程之工厂方法模式的使用
Mar 02 Python
使用 Python 实现微信公众号粉丝迁移流程
Jan 03 Python
python梯度下降法的简单示例
Aug 31 Python
python实现石头剪刀布小游戏
Jan 20 Python
如何使用python爬虫爬取要登陆的网站
Jul 12 Python
python图形绘制奥运五环实例讲解
Sep 14 Python
python元组的概念知识点
Nov 19 Python
Pycharm无法打开双击没反应的问题及解决方案
Aug 17 Python
Anaconda使用IDLE的实现示例
Sep 23 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
PyQt QMainWindow的使用示例
Mar 24 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调用Oracle存储过程的方法
2008/09/12 PHP
PHP 文件系统详解
2012/09/13 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
一个基于jquery的文本框记数器
2012/09/19 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
javascript定义变量时加var与不加var的区别
2014/12/22 Javascript
用JS动态改变表单form里的action值属性的两种方法
2016/05/25 Javascript
BootStrap中
2016/12/10 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
使用微信小程序开发弹出框应用实例详解
2018/10/18 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
JS变量提升及函数提升实例解析
2020/09/03 Javascript
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
Python heapq使用详解及实例代码
2017/01/25 Python
python sqlite的Row对象操作示例
2019/09/11 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
Python使用Matlab命令过程解析
2020/06/04 Python
python实现粒子群算法
2020/10/15 Python
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
单位工作证明格式模板
2014/10/04 职场文书
七一慰问简报
2015/07/20 职场文书
教师岗位说明书
2015/09/30 职场文书
如何自己动手写SQL执行引擎
2021/06/02 MySQL
德劲DE1102数字调谐收音机机评
2022/04/07 无线电