一、生成人脸识别数据
这里需要一些包含不同表情的图像,但是,必须确保样本图像满足如下条件:
- 图像是灰度格式,后缀名为.pgm
- 图像形状为正方形
- 图像大小要一样(eg. 200*200)
import cv2 as cv
import os
VIDEO_PATH = 'D:/Temp/python_project/test_data/video'
PGM_PATH = "D:/Temp/python_project/opencv/pgm"
def generate():
count = 0
# Here is getting sample images from 4 videos. You can also get sample images
# from camera directly by using cv.VideoCapture(0) .
for videoName in ['nod.mp4', 'shaking_head.mp4', 'blink.mp4', 'smile.mp4']:
print(videoName)
camera = cv.VideoCapture(os.path.join(VIDEO_PATH, videoName))
while (True):
ret, frame = camera.read()
frame = cv.flip(frame, 1)
if frame is None:
break
else:
rows, cols, channels = frame.shape
M = cv.getRotationMatrix2D(((cols - 1) / 2.0, (rows - 1) / 2), 270, 1)
img = cv.warpAffine(frame, M, (cols, rows))
face_cascade = cv.CascadeClassifier('D:/Temp/python_project/opencv/cascades/haarcascade_frontalface_default.xml')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5, minSize=(450, 450))
for (x,y,w,h) in faces:
img = cv.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
f = cv.resize(gray[y:y+h, x:x+w], (200,200))
cv.imwrite(os.path.join(PGM_PATH, '%s.pgm') % str(count), f)
count += 1
cv.namedWindow('Face detected')