通过 opencv现有的人脸检测模型 ------- haarcascade_frontalface_alt.xml
,对实时视频中的人脸进行检测,通过循环,对每一帧图像进行灰度化处理,利用检测到的人脸返回对应的坐标,进行对图像的矩形框绘制,并通过对应的x,y,w,h。可裁剪出我们感兴趣的ROI区域,即人脸区域,然后进行图像的裁剪和保存,涉及python基础的保存文件,if判断,循环等知识。
import time
import cv2
video=cv2.VideoCapture(0)
face_data=cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
name=1
flag=False
epoch=0
start=time.time()
while True:
#过一段时间输出一次
if epoch% 10==0:
print('输入q结束人脸系统,输入a保存当前人脸')
open,cap=video.read()
if open==False:
print('无法调用摄像头')
break
gray=cv2.cvtColor(cap,cv2.COLOR_BGR2GRAY)#将每一帧图片给进行灰度化
face=face_data.detectMultiScale(gray)#将检测到的人脸图像(坐标)以列表形式返回
for x,y,h,w in face:
face_picture=gray[y:y+w,x:x+h]#裁剪灰度图像中的人脸的图像
#我们需要统一尺寸
face_picture=cv2.resize(face_picture,dsize=(80,80))
#通过调用命令及逆行保存图片
if flag==True:
#将获取的人脸数据图片进行保存
cv2.imwrite(f'./face picture/{name}.jpg',face_picture)
print(face_picture.shape)
name+=1
cv2.rectangle(cap,pt1=(x,y),pt2=(x+h,y+w),color=[0,0,255],thickness=3)#对图片上的人脸进行框选
#只截取20张照片
if name>20:
print('人脸照片截取成功')
break
frame = cv2.flip(cap, 1) # 摄像头是和人对立的,将图像左右调换回来正常显示。
cv2.imshow('face', frame) # 展示人脸识别的图片
key = cv2.waitKey(1000//24) # 设置等待多长时间
if key ==ord('q'):#按q退出系统
break
if key==ord('a'):#当按键为a时,进行保存人脸数据
flag=True
print('已经启动----正在截取人脸')
epoch+=1
over=time.time()
time=int(over-start)
print(f'一共消耗的时间是{time}s')
cv2.destroyAllWindows()#关闭窗口
video.release()#释放摄像头资源
#查看你保存的人脸的数据
def aaa():
import os
import cv2
import numpy as np
kkk=[]
lists=os.listdir('./face picture')#调用系统来查找列表中相应文件夹
for l in lists:
print(l)
ppp=cv2.imread(f'./face picture/%s'%l)#依次读取照片
print(ppp.shape)
ppp_=ppp[:, :, 0]#将三维图片转换成二维图片
kkk.append(ppp_)
face=np.asarray(kkk)#转换为数组
print(face.shape)#可以知道数组内有多少个照片以及尺寸
仅供学习参考,如有不足,敬请指正!