网络编程
位置:首页>> 网络编程>> Python编程>> python调用虹软2.0第三版的具体使用

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

作者:隔壁的王  发布时间:2022-03-23 06:32:19 

标签: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])

来源:https://www.cnblogs.com/wxt51/p/10125460.html

0
投稿

猜你喜欢

  •  在一群里有朋友发问,有时间,也就看看了,不多说了,看图了:用一般的 select .... order 排序出来,就如下图了,是
  • 描述微软开发的两个动态库存在后门允许用户查看ASP文件源程序和下载整个网站详细随IIS和Frontpage Extention server
  • 目录题目描述示例 1:示例 2:示例 3:单向构造(哈希表计数)双向构造(双指针)最后题目描述这是 LeetCode 上的 1743. 从相
  • 简介你手中的这本《JavaScript王者归来》不仅是一本传播知识的书,更是一本求道的书。本书分为五个部分循序渐进地与读者讨论了JavaSc
  • 代数运算定义加法运算图像叠加需要满足该条件:两幅图像的像素必须相同(尺寸,形状)减法运算乘法运算1、图像的局部显示。2、用二值蒙版图像与原图
  • 在asp中调用sql server的存储过程可以加快程序运行速度,本文介绍了asp使用存储过程的方法。1.调用存储过程的一般方法 先假设在s
  • 为了测试某个服务的稳定性,通常需要在服务长时间运行的情况下,监控其资源消耗情况,比如cpu和内存使用这里借助python的psutil这个包
  • 一个什么都不懂的家伙非跟我要个sql查询器 随便写了一个,当然为了数据安全,要过滤掉一个sql关键词和系统中的一些表了 哦,对了,里面的一些
  • 二维码的分类线性堆叠式二维码矩阵式二维码二维码的优缺点优点信息容量大编码范围广容错能力强译码可靠性高可引入加密措施成本低,易制作缺点二维码技
  • 网上广泛流传的取 object 的绝对位置的做法是:var getAbsPos = function(pTar
  • 最近几年,jupyter在全球数据科学领域,已经成为不可或缺的重要工具。在jupyter中用python写程序,若import了自己写的外部
  • 您是否常常在做网页的过程中发现一个问题呢?当图片上传的时候,如果图片太大 ,就会把网页撑破,唯一做的就要先把它用软件缩小,再上传上
  • 前言本文主要给大家介绍了关于python使用正则表达式的非贪婪模式的相关内容,分享出来供大家参考学习,下面话不多说了,来一起详细的介绍吧。在
  • 本文实例为大家分享了python实现飞船大战的具体代码,供大家参考,具体内容如下上篇博文我们一起实现了贪吃蛇与坦克大战200行python代
  • 在开始聊我在阿里四个月的网页推广设计之前,我想先来说说我对平面设计和网页设计的认识。它们之间的交集。它们都是集艺术创作、电脑技术和数字技术于
  • 这种情况在挂载脚本后无法答题,任何关于答题脚本的脚本都无法使用。看这个字体,已经读不出原文了,一开始以为是加密尝试使用加密算法破解,然后用B
  • 在官网下载源码包:https://www.php.net/downloads.php步骤:1、解压命令:tar -xjvf php.tar.
  • 我在Web服务器端安装了Web Server IIS4.0、Oracle Net8 for Client,并创建好了和Oracle8数据库的
  • 在mysql网站时拿到的rpm包只能用root安装,不支持relocate用源码安装后./configure --prefix=/home/
  • 所谓天赋(左脑和右脑)也就是你是否有艺术天赋,天赋也许是存在的,这主要在于人类左右脑的分工。左脑主要负责逻辑理解、语言、判断、分类、分析、推
手机版 网络编程 asp之家 www.aspxhome.com