上一篇讲了人脸检测,人脸识别的过程是人脸检测,保存数据,训练模型,人脸识别。所以现在来是保存人脸数据,保存人脸数据就是在摄像头进行人脸检测的基础上对检测的人脸进行截取和保存。
先是对灰度化后的人脸进行修整:
f = cv2.resize(gray[y:y+h, x:x+w], (200, 200))#对人脸灰度图进行修整,修整成200*200的图
img_name = '%s/%d.pgm'%(path_name, count)#对每个图进行命名
然后用opencv的imwrite对人脸图像进行保存,形成训练集:
cv2.imwrite(img_name, f) #训练集写入路径
count += 1 #保存一个命名加一,即下一个图的名字或者编号
保存到一定数量进行退出,一般正负训练集比为1:3,大家看情况保存
完整代码如下:
import cv2
def generate(path_name,pic_num):
mkdir(path_name)#创建文件夹
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')
camera = cv2.VideoCapture(0)
count = 1
i = 0
while(True):
ret, frame = camera.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
i = i + 1
img = cv2.rectangle(frame, (x,y), (x+w, y+h), (255,0,0), 2 ) #框柱人脸,表示识别人脸,然后进行人脸采集
if i == 3:
i = 0
f = cv2.resize(gray[y:y+h, x:x+w], (200, 200))
img_name = '%s/%d.pgm'%(path_name, count)
cv2.putText(img, str(count), (x, y -20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)
cv2.imwrite(img_name, f) #训练集写入路径
count += 1
if count > pic_num:
break
cv2.imshow("camera", frame)
if cv2.waitKey(1) & 0xff == ord("q"):
break
camera.release() #释放摄像头
cv2.destroyAllWindows() #关闭窗口
结果如下:
这是保存在对应人名目录下的15张人脸数据