dlib与opencv都包含了人脸检测接口,dlib比opencv对图片抗遮挡性强,一般数据预处理使用dlib函数库,摄像头人脸检测两者差不多,图像裁剪一般用opencv,总的来说,视频采集两者性能差不多,图片提取特征dlib更好点
只限于提取人脸特征,一般图像处理尺寸、灰度用的是opencv
下面直接上代码
import os
import cv2
import dlib
import time
from readImage import readAllImg
#从源路径中读取所有图片放入一个list,然后逐一进行检查,把其中的脸扣下来,存储到目标路径中
def readPicSaveFace(sourcePath,objectPath,*suffix):
try:
#读取照片,注意第一个元素是文件名
resultArray=readAllImg(sourcePath,*suffix)
#对list中图片逐一进行检查,找出其中的人脸然后写到目标文件夹下
count = 1
# face_cascade = cv2.CascadeClassifier('D:\opencv\sources\data\haarcascades\haarcascade_frontalface_alt.xml')
# 使用detector进行人脸检测
# 使用dlib自带的frontal_face_detector作为我们的特征提取器
detector = dlib.get_frontal_face_detector()
for i in resultArray:
if type(i) != str:
gray = cv2.cvtColor(i, cv2.COLOR_BGR2GRAY)
# faces = face_cascade.detectMultiScale(gray, 1.3, 5)
dets = detector(gray, 1) # 提取截图中所有人脸
for i, d in enumerate(dets): # 依次区分截图中的人脸
x1 = d.top() if d.top() > 0 else 0
y1 = d.bottom() if d.bottom() > 0 else 0
x2 = d.left() if d.left() > 0 else 0
y2 = d.right() if d.right() > 0 else 0
listStr = [str(int(time.time())), str(count)] #以时间戳和读取的排序作为文件名称
fileName = ''.join(listStr)
f = cv2.resize(gray[x1:y1, x2:y2], (128, 128)) #设置截图大小并截取
cv2.imwrite(objectPath+os.sep+'%s.jpg' % fileName, f)
count += 1
# for (x, y, w, h) in faces:
#
# listStr = [str(int(time.time())), str(count)] #以时间戳和读取的排序作为文件名称
# fileName = ''.join(listStr)
#
# f = cv2.resize(gray[y:(y + h), x:(x + w)], (128, 128)) #设置截图大小并截取
# cv2.imwrite(objectPath+os.sep+'%s.jpg' % fileName, f)
# count += 1
except IOError:
print("Error")
else:
print('Already read '+str(count-1)+' Faces to Destination '+objectPath)
if __name__ == '__main__':
# 从文件里面读名字
# names = []
# with open('../src//name.txt') as f:
# for i in f.readlines():
# names.append(i.strip('\r\n'))
# for name in names:
# print(name)
# readPicSaveFace('../src/Preunder/data/middata/' + name,
# '../src/Preunder/data/cutdata/' + name,
# '.jpg','.JPG','png','PNG')
readPicSaveFace('ch09\shuju\LeiFeng',
'ch09\shuju\LeiFeng_',
'.jpg','.JPG','png','PNG')
代码亮的部分是利用dlib进行检测,灰色部分表示利用opencv进行检测