二、构建人脸识别数据库(Python)(build_face_dataset.py)

1. 代码部分

此代码块为build_face_dataset.py内的代码

# USAGEh
# python build_face_dataset.py --cascade haarcascade_frontalface_default.xml --output dataset/adrian

# 导入
from imutils.video import VideoStream
import imutils
import time
import cv2
import os

# 形参name是待录入人脸的人的姓名英文缩写
def build_face_dataset(name):
    
    # 加载OpenCV的Haar人脸检测器detector
    detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    print("[INFO] starting video stream...")
    # 初始化并开启视频流 VideoStreem(参数src设置为1,使用内置摄像头)
    vs = VideoStream(src=1).start()
    # 如果使用的是树莓派,第17行的代码替换为第19行的代码
    # vs = VideoStream(usePiCamera=True).start()
    # 让摄像头传感器预热,暂停两秒钟
    time.sleep(2.0)
    # 初始化total计数器来表示保存的人脸图片的数量
    total = 0
    
    # 开始循环(循环在『q』键被按下之后结束)
    while True:
        # 捕捉一帧画面:frame
        frame = vs.read()
        # 克隆捕捉到的画面,将画面写入磁盘时将会用到(见程序第51行)
        orig = frame.copy()
        # 调整帧大小,以便我们可以更快地应用面部检测
        frame = imutils.resize(frame, width=400)
    
        # 检测灰度帧中的人脸
        # 使用detectMultiScale方法在每帧画面中检测人脸
        # image:一个灰度图像;scaleFactor:指定在每个维度图像尺寸减少的比例
        # minNeighbor:指定候选的检测框数量,以保证检测是有效的;
        # minSize:最小的人脸图像尺寸        
        rects = detector.detectMultiScale(
                cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY), scaleFactor=1.1, 
                minNeighbors=5, minSize=(30, 30))
    
        # 人脸检测的结果保存在列表rects(矩形检测框)中,
        # 循环进行面部检测,并将矩形画在图片上。
        for (x, y, w, h) in rects:
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
  
        # 将该帧图像显示在屏幕上
        cv2.imshow("Frame", frame)
        # 捕捉键盘指令【cv2.waitKey(1) 1为参数,单位毫秒,表示间隔时间
                      # 0xFF是十六进制常数,通过运算只留下原始的最后8位,防止BUG。】
        key = cv2.waitKey(1) & 0xFF
     
        # 按k保留该帧图像并保存到硬盘中,以便我们以后处理它并将其用于人脸识别
        # 同时增加total计数器
        if key == ord('k') or key == 'k': 
            p = os.path.sep.join(['dataset/' + name, "{}.png".format(
                    str(total).zfill(5))])
            cv2.imwrite(p, orig)
            total += 1
    
        # 按q退出循环
        elif key == ord('q') or key == 'q':
            break
    
    # 打印保存的图片数量
    print("[INFO] {} face images stored".format(total))
    # 清空缓存
    print("[INFO] cleaning up...")
    cv2.destroyAllWindows()
    vs.stop()
    
if __name__ == '__main__':
    build_face_dataset('zjw')

2. 使用说明

这个构建人脸数据库的函数可以单独使用,也可以作为视频流人脸识别系统中的一个函数使用。
视频流人脸识别系统的系统函数见此博客:一、视频流人脸识别系统的系统函数的构建(Python)
文中用到的haarcascade_frontalface_default.xml文件在此处下载:人脸识别集成包

猜你喜欢

转载自blog.csdn.net/mahoon411/article/details/106182516