python 人脸检测 大胡子_基于python Arcface 实现人脸检测和识别

虹软的人脸识别技术也是很强的,重要的是他免费提供了离线的sdk,还提供了实例,这个是目前几家研究人脸识别的大公司里面少有的。识别能力正常用还是可以的。我这个代码是调用的离线sdk实现的

```

from arcsoft import CLibrary, ASVL_COLOR_FORMAT, ASVLOFFSCREEN,c_ubyte_p,FaceInfo

from arcsoft.utils import BufferInfo, ImageLoader

from arcsoft.AFD_FSDKLibrary import *

from ctypes import *

import traceback

import cv2

import time

APPID = c_char_p(b'your id')

FD_SDKKEY = c_char_p(b'your key')

FD_WORKBUF_SIZE = 20 * 1024 * 1024

MAX_FACE_NUM = 50

bUseYUVFile = False

bUseBGRToEngine = True

def doFaceDetection(hFDEngine, inputImg): #对图像中的人脸进行定位

faceInfo = []

pFaceRes = POINTER(AFD_FSDK_FACERES)()

ret = AFD_FSDK_StillImageFaceDetection(hFDEngine, byref(inputImg), byref(pFaceRes))

#ret 为0

if ret != 0:

print(u'AFD_FSDK_StillImageFaceDetection 0x{0:x}'.format(ret))

return faceInfo

faceRes = pFaceRes.contents

print('******')

facecont=faceRes.nFace #faceRes 是一个对象所以 输出会是一个地址值 而他的一个属性nface是表示的是人脸的个数

print('%d 个人脸' %facecont)

if faceRes.nFace > 0:

for i in range(0, faceRes.nFace):

rect = faceRes.rcFace[i]

orient = faceRes.lfaceOrient[i]

faceInfo.append(FaceInfo(rect.left,rect.top,rect.right,rect.bottom,orient))

return faceInfo

def loadImage(filePath):

inputImg = ASVLOFFSCREEN()

if bUseBGRToEngine: #true

bufferInfo = ImageLoader.getBGRFromFile(filePath)

inputImg.u32PixelArrayFormat = ASVL_COLOR_FORMAT.ASVL_PAF_RGB24_B8G8R8

inputImg.i32Width = bufferInfo.width

inputImg.i32Height = bufferInfo.height

inputImg.pi32Pitch[0] = bufferInfo.width*3

inputImg.ppu8Plane[0] = cast(bufferInfo.buffer, c_ubyte_p)

inputImg.ppu8Plane[1] = cast(0, c_ubyte_p)

inputImg.ppu8Plane[2] = cast(0, c_ubyte_p)

inputImg.ppu8Plane[3] = cast(0, c_ubyte_p)

else:

bufferInfo = ImageLoader.getI420FromFile(filePath)

inputImg.u32PixelArrayFormat = ASVL_COLOR_FORMAT.ASVL_PAF_I420

inputImg.i32Width = bufferInfo.width

inputImg.i32Height = bufferInfo.height

inputImg.pi32Pitch[0] = inputImg.i32Width

inputImg.pi32Pitch[1] = inputImg.i32Width // 2

inputImg.pi32Pitch[2] = inputImg.i32Width // 2

inputImg.ppu8Plane[0] = cast(bufferInfo.buffer, c_ubyte_p)

inputImg.ppu8Plane[1] = cast(addressof(inputImg.ppu8Plane[0].contents) + (inputImg.pi32Pitch[0] * inputImg.i32Height), c_ubyte_p)

inputImg.ppu8Plane[2] = cast(addressof(inputImg.ppu8Plane[1].contents) + (inputImg.pi32Pitch[1] * inputImg.i32Height // 2), c_ubyte_p)

inputImg.ppu8Plane[3] = cast(0, c_ubyte_p)

inputImg.gc_ppu8Plane0 = bufferInfo.buffer

return inputImg

if __name__ == u'__main__':

t=time.time()

print(u'#####################################################')

# init Engine

pFDWorkMem = CLibrary.malloc(c_size_t(FD_WORKBUF_SIZE))

hFDEngine = c_void_p()

ret = AFD_FSDK_InitialFaceEngine(APPID, FD_SDKKEY, pFDWorkMem, c_int32(FD_WORKBUF_SIZE), byref(hFDEngine), AFD_FSDK_OPF_0_HIGHER_EXT, 32, MAX_FACE_NUM)

#ret 为0

if ret != 0:

CLibrary.free(pFDWorkMem)

print(u'AFD_FSDK_InitialFaceEngine ret 0x{:x}'.format(ret))

exit(0)

#--------------------------------以上部分两个函数以及主函数的几条语句不变-----------------------------------------------------------

filePath = '001.jpg'

inputImg = loadImage(filePath) #调用loadImage函数 返回一种格式(目前还不知道这种格式是什么)

frame=cv2.imread(filePath)

# do Face Detect

faceInfos = doFaceDetection(hFDEngine, inputImg) #调用dofaceDetection函数 进行图像处理检测人脸

#print('faceInfos %s'% faceInfos[0])

for i in range(0, len(faceInfos)):

rect = faceInfos[i]

print(u'{} ({} {} {} {}) orient {}'.format(i, rect.left, rect.top, rect.right, rect.bottom, rect.orient))

cv2.rectangle(frame, (rect.left, rect.top), (rect.right, rect.bottom), (0, 0, 255), 2)

cropimg=frame[rect.top:rect.bottom,rect.left:rect.right]# 使用opencv裁剪照片 把人脸的照片裁剪下来

cv2.imwrite('crop-photo/'+str(i)+'.jpg',cropimg) # 把人脸照片保存下来

AFD_FSDK_UninitialFaceEngine(hFDEngine) # release Engine

cv2.imshow('tuxiang',frame)

cv2.waitKey(1)

print('所用时间为{} '.format(time.time()-t)) #不进行保存图片 0.12s 保存图片0.16s

time.sleep(1)

CLibrary.free(pFDWorkMem)

print(u'#####################################################')

运行结果

![](https://oscimg.oschina.net/oscnet/7fc55619ab96c8fae01e434bb040cb2269d.jpg)

运行时间0.14800000190734863

底层是c写的所以运行起来还是比较快的  使用的是离线的sdk配置需要动态链接库fd (官网有)

对于虹软的这个 我只会用 里面的代码很大一部分都是不懂的,因为那些函数都被封装起来了,定义看不到也看不懂。

opencv就是用来显示照片以及标框  time用来测时间和暂停

对于虹软的人脸识别,是使用了另一种动态链接库fr,跟这个类似,代码有些差别,等做出来基于虹软的实时的人脸识别再分享出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值