这一版,对虹软的功能进行了一些封装,添加了人脸特征比对,比对结果保存到文件,和从文件提取特征进行比对,大体功能基本都已经实现,可以进行下一步的应用开发了
face_class.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
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