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

face_class.py

  1. from ctypes import *
  2. #人脸框
  3. class MRECT(Structure):
  4. _fields_=[(u'left1',c_int32),(u'top1',c_int32),(u'right1',c_int32),(u'bottom1',c_int32)]
  5. #版本信息 版本号,构建日期,版权说明
  6. class ASF_VERSION(Structure):
  7. _fields_=[('Version',c_char_p),('BuildDate',c_char_p),('CopyRight',c_char_p)]
  8. #单人人脸信息 人脸狂,人脸角度
  9. class ASF_SingleFaceInfo(Structure):
  10. _fields_=[('faceRect',MRECT),('faceOrient',c_int32)]
  11. #多人人脸信息 人脸框数组,人脸角度数组,人脸数
  12. class ASF_MultiFaceInfo(Structure):
  13. # _fields_=[('faceRect',POINTER(MRECT)),('faceOrient',POINTER( c_int32)),('faceNum',c_int32)]
  14. _fields_=[(u'faceRect',POINTER(MRECT)),(u'faceOrient',POINTER(c_int32)),(u'faceNum', c_int32)]
  15. # _fields_=[(u'faceRect',MRECT*50),(u'faceOrient',c_int32*50),(u'faceNum',c_int32)]
  16. #人脸特征 人脸特征,人脸特征长度
  17. class ASF_FaceFeature(Structure):
  18. _fields_=[('feature',c_void_p),('featureSize',c_int32)]
  19. #自定义图片类
  20. class IM:
  21. def __init__(self):
  22. self.filepath=None
  23. self.date=None
  24. self.width=0
  25. self.height=0

face_dll.py

  1. from ctypes import *
  2. from face_class import *
  3. wuyongdll=CDLL('d:\python\Test\Face\lib\X64\libarcsoft_face.dll')
  4. dll=CDLL('d:\python\Test\Face\lib\X64\libarcsoft_face_engine.dll')
  5. dllc=cdll.msvcrt
  6. ASF_DETECT_MODE_VIDEO = 0x00000000
  7. ASF_DETECT_MODE_IMAGE = 0xFFFFFFFF
  8. c_ubyte_p = POINTER(c_ubyte)
  9. #激活
  10. jihuo=dll.ASFActivation
  11. jihuo.restype = c_int32
  12. jihuo.argtypes = (c_char_p,c_char_p)
  13. #初始化
  14. chushihua=dll.ASFInitEngine
  15. chushihua.restype=c_int32
  16. chushihua.argtypes=(c_long,c_int32,c_int32,c_int32,c_int32,POINTER(c_void_p))
  17. #人脸识别
  18. shibie=dll.ASFDetectFaces
  19. shibie.restype=c_int32
  20. shibie.argtypes=(c_void_p,c_int32,c_int32,c_int32,POINTER(c_ubyte),POINTER(ASF_MultiFaceInfo))
  21. #特征提取
  22. tezheng=dll.ASFFaceFeatureExtract
  23. tezheng.restype=c_int32
  24. tezheng.argtypes=(c_void_p,c_int32,c_int32,c_int32,POINTER(c_ubyte),POINTER(ASF_SingleFaceInfo),POINTER(ASF_FaceFeature))
  25.  
  26. #特征比对
  27. bidui=dll.ASFFaceFeatureCompare
  28. bidui.restype=c_int32
  29. bidui.argtypes=(c_void_p,POINTER(ASF_FaceFeature),POINTER(ASF_FaceFeature),POINTER(c_float))
  30. malloc = dllc.malloc
  31. free = dllc.free
  32. memcpy = dllc.memcpy
  33.  
  34. malloc.restype = c_void_p
  35. malloc.argtypes = (c_size_t, )
  36. free.restype = None
  37. free.argtypes = (c_void_p, )
  38. memcpy.restype = c_void_p
  39. memcpy.argtypes = (c_void_p, c_void_p, c_size_t)

face_function.py

  1. import face_dll,face_class
  2. from ctypes import *
  3. import cv2
  4. from io import BytesIO
  5. # from Main import *
  6. Handle=c_void_p()
  7. c_ubyte_p = POINTER(c_ubyte)
  8. # 激活函数
  9. def JH(appkey,sdkey):
  10. ret=face_dll.jihuo(appkey,sdkey)
  11. return ret
  12. # 初始化函数
  13. def CSH():# 1:视频或图片模式,2角度,3最小人脸尺寸推荐16,4最多人脸数最大50,5功能,6返回激活句柄
  14. ret=face_dll.chushihua(0xFFFFFFFF,0x1,16,50,5,byref(Handle))
  15. # Main.Handle=Handle
  16. return ret,Handle
  17. # cv2记载图片并处理
  18. def LoadImg(im):
  19. img=cv2.imread(im.filepath)
  20. sp=img.shape
  21. img=cv2.resize(img,(sp[1]//4*4,sp[0]//4*4))
  22. sp=img.shape
  23. im.data=img
  24. im.width=sp[1]
  25. im.height=sp[0]
  26. return im
  27. def RLSB(im):
  28. faces=face_class.ASF_MultiFaceInfo()
  29. img=im.data
  30. imgby=bytes(im.data)
  31. imgcuby=cast(imgby,c_ubyte_p)
  32. ret=face_dll.shibie(Handle,im.width,im.height,0x201,imgcuby,byref(faces))
  33. return ret,faces
  34. # 显示人脸识别图片
  35. def showimg(im,faces):
  36. for i in range(0,faces.faceNum):
  37. ra=faces.faceRect[i]
  38. cv2.rectangle(im.data,(ra.left1,ra.top1),(ra.right1,ra.bottom1),(255,0,0,),2)
  39. cv2.imshow('faces',im.data)
  40. cv2.waitKey(0)
  41. #提取人脸特征
  42. def RLTZ(im,ft):
  43. detectedFaces=face_class.ASF_FaceFeature()
  44. img=im.data
  45. imgby=bytes(im.data)
  46. imgcuby=cast(imgby,c_ubyte_p)
  47. ret=face_dll.tezheng(Handle,im.width,im.height,0x201,imgcuby,ft,byref(detectedFaces))
  48. if ret==0:
  49. retz=face_class.ASF_FaceFeature()
  50. retz.featureSize=detectedFaces.featureSize
  51. #必须操作内存来保留特征值,因为c++会在过程结束后自动释放内存
  52. retz.feature=face_dll.malloc(detectedFaces.featureSize)
  53. face_dll.memcpy(retz.feature,detectedFaces.feature,detectedFaces.featureSize)
  54. # print('提取特征成功:',detectedFaces.featureSize,mem)
  55. return ret,retz
  56. else:
  57. return ret
  58. #特征值比对,返回比对结果
  59. def BD(tz1,tz2):
  60. jg=c_float()
  61. ret=face_dll.bidui(Handle,tz1,tz2,byref(jg))
  62. return ret,jg.value
  63. #单人特征写入文件
  64. def writeFTFile(feature,filepath):
  65. f = BytesIO(string_at(feature.feature,feature.featureSize))
  66. a=open(filepath,'wb')
  67. a.write(f.getvalue())
  68. a.close()
  69. #从多人中提取单人数据
  70. def getsingleface(singleface,index):
  71. ft=face_class.ASF_SingleFaceInfo()
  72. ra=singleface.faceRect[index]
  73. ft.faceRect.left1=ra.left1
  74. ft.faceRect.right1=ra.right1
  75. ft.faceRect.top1=ra.top1
  76. ft.faceRect.bottom1=ra.bottom1
  77. ft.faceOrient=singleface.faceOrient[index]
  78. return ft
  79. #从文件获取特征值
  80. def ftfromfile(filepath):
  81. fas=face_class.ASF_FaceFeature()
  82. f=open('d:/1.dat','rb')
  83. b=f.read()
  84. f.close()
  85. fas.featureSize=b.__len__()
  86. fas.feature=face_dll.malloc(fas.featureSize)
  87. face_dll.memcpy(fas.feature,b,fas.featureSize)
  88. return fas

Main1.py

  1. import face_dll,face_class
  2. from ctypes import *
  3. import cv2
  4. import face_function as fun
  5. Appkey=b''
  6. SDKey=b''
  7. # 激活
  8. ret=fun.JH(Appkey,SDKey)
  9. if ret==0 or ret==90114:
  10. print('激活成功:',ret)
  11. else:
  12. print('激活失败:',ret)
  13. pass
  14. # 初始化
  15. ret=fun.CSH()
  16. if ret[0]==0:
  17. print('初始化成功:',ret,'句柄',fun.Handle)
  18. else:
  19. print('初始化失败:',ret)
  20. # 加载图片
  21. im=face_class.IM()
  22. im.filepath='e:/2.jpg'
  23. im=fun.LoadImg(im)
  24. print(im.filepath,im.width,im.height)
  25. # cv2.imshow('im',im.data)
  26. # cv2.waitKey(0)
  27. print('加载图片完成:',im)
  28.  
  29. ret=fun.RLSB(im)
  30. if ret[0]==-1:
  31. print('人脸识别失败:',ret)
  32. pass
  33. else:
  34. print('人脸识别成功:',ret)
  35. # 显示人脸照片
  36. # showimg(im,ret)
  37. #提取单人1特征
  38. ft=fun.getsingleface(ret[1],0)
  39. tz1=fun.RLTZ(im,ft)[1]
  40. #提取单人2特征
  41. ft=fun.getsingleface(ret[1],1)
  42. tz2=fun.RLTZ(im,ft)[1]
  43. #特征保存到文件
  44. # fun.writeFTFile(tz1,'d:/1.dat')
  45. # fun.writeFTFile(tz2,'d:/2.dat')
  46. #文件获取特征
  47. tz=fun.ftfromfile('d:/1.dat')
  48. jg=fun.BD(tz1,tz)
  49. print(jg[1])
  50. #结果比对
  51. # jg=fun.BD(tz1,tz2)
  52. # print(jg[1])

python调用虹软2.0第三版的更多相关文章

  1. python调用虹软2.0(全网首发)-更新中

    python调用虹软2.0目前没有任何demo可以参考,自己研究了2个晚上终于把第一步做出来了,使用了opencv来加载和显示图片,龟速更新中 这一版作废,新版已发出:https://www.cnbl ...

  2. python调用虹软2.0第二版

    第一版踩了无数的坑,终于第二版把坑全添了,这次更新可以正常获取人脸数,角度,代码可读性更高,继续更新中 第三版已发出 https://www.cnblogs.com/wxt51/p/10125460. ...

  3. python调用虹软2.0

    第一版踩了无数的坑,终于第二版把坑全添了,这次更新可以正常获取人脸数,角度,代码可读性更高,继续更新中 第三版已发出 https://www.cnblogs.com/wxt51/p/10125460. ...

  4. Python调用ansible API系列(三)带有callback的执行adhoc和playbook

    在第二篇文章中虽然可以执行adhoc和playbook但是执行结果的输出并不是特别直观,虽然没有报错但是到底什么结果其实你是不知道的尤其是在执行adhoc的时候,这时候我们要利用callback来设置 ...

  5. python全栈开放实践第三版第一章的练习题完成情况

    练习题: 1.简述编译型与解释型语言的区别,且分别列出你知道哪些语言属于编译型,哪些数以解释型.1 编译型:只须编译一次就可以把源代码编译成机器语言,后面的执行无须重新编译,直接使用之前的编译结果就可 ...

  6. Python调用C/C++程序

    编程中会遇到调用其他语言到库,这里记录一下Python调用C++. Python底层是C, 所以调用C还是比较方便.调用C++有些麻烦. Python提供了ctypes, 方便将Python类型转为C ...

  7. Python黑帽编程3.0 第三章 网络接口层攻击基础知识

    3.0 第三章 网络接口层攻击基础知识 首先还是要提醒各位同学,在学习本章之前,请认真的学习TCP/IP体系结构的相关知识,本系列教程在这方面只会浅尝辄止. 本节简单概述下OSI七层模型和TCP/IP ...

  8. selenium webdriver (python) 第三版

    感谢 感谢购买第二版的同学,谢谢你们对本人劳动成果的支持!也正是你们时常问我还出不出第三版了,也是你们的鼓励,让我继续学习整理本文档. 感谢乙醇前辈,第二版的文档是放在他的淘宝网站上卖的,感谢他的帮忙 ...

  9. 笨办法学 Python (第三版)(转载)

    笨办法学 Python (第三版) 原文地址:http://blog.sina.com.cn/s/blog_72b8298001019xg8.html   摘自https://learn-python ...

随机推荐

  1. iOS 开发笔记-Storyboard

    什么时候用Pust,什么时候用Modal? 一般情况下,是导航控制器点过去的,都使用Pust.如果是相对独立的,则用Modal,比如是导航上面的+添加之类. 关闭一个Modal -(IBAction) ...

  2. Java编写验证码

    Java后台代码(CheckCodeServlet.java) package web; import java.awt.Color; import java.awt.Font; import jav ...

  3. Django初级手册6-静态文件

    用Django加载外部文件 在Django中iamges,JS或者CSS通称为static文件 定制APP的外观 一般放在应用目录下的static/polls/目录下,下为polls/static/p ...

  4. Fenwick

    hdu1394 这题说的是给了一个序列计算这个序列的逆序对总共要进行n次 每次都将目前的第一个放到序列的最后一个位置然后 计算一次逆序对 这样我们只需要先求一次逆序对 然后接着每次都用F=F+(n-T ...

  5. linux常用命令:chkconfig 命令

    chkconfig命令用来安装,查看或修改 services随系统启动的启动选项的设置.是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各 ...

  6. Qt学习之路(45): 自定义model之一

    前面我们说了Qt提供的几个预定义model.但是,面对变化万千的需求,那几个model是远远不能满足我们的需要的.另外,对于Qt这种框架来说,model的选择首先要能满足绝大多数功能的需要,这就是说, ...

  7. oracle中验证身份证是否合法的函数脚本

    --创建函数 入参是身份证   返回1 合法 0不合法 CREATE OR REPLACE FUNCTION fn_checkidcard (p_idcard IN VARCHAR2) RETURN ...

  8. 出现“基础链接已关闭,无法链接到远程服务器"错误的解决办法

    一些用户在安装一些软件或是系统做某些修改后,采集器就没无登录或是无法获取到网页.登录或是使用httppostget工具会出现 ”基础链接已关闭,无法链接到远程服务器“的提示.经分析,是系统Socket ...

  9. SmartOS之以太网精简协议栈TinyIP

    做物联网,没有以太网怎么能行!基于Enc28j60,我们团队独立实现了以太网精简协议栈TinyIP,目前支持ARP/ICMP/TCP/UDP/DHCP,还缺一个DNS就完整了.TinyIP内置一个数据 ...

  10. linux中线程池【转】

    本文转载自:http://blog.csdn.net/yusiguyuan/article/details/18401277 一.线程池 大多数的网络服务器,包括Web服务器都具有一个特点,就是单位时 ...