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

时间:2025-04-06 07:42:16
# 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')