利用dlib与cv2实现人脸检测和截取

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进行检测

猜你喜欢

转载自blog.csdn.net/m0_47709941/article/details/123763914