二、构建人脸识别数据库(Python)(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)
# 捕捉键盘指令【(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')