参考b站的一个视频,大家有兴趣可以去搜一下
注意:人脸识别分类器需要自己安装
就是这几个xml文件
运行这个程序
import cv2
import os
def CatchPICFromVideo(catch_pic_num,path_name):
# 视频来源,可以来自一段已保存的视频,也可以来自于摄像头
cap = cv2.VideoCapture(0) # 获取摄像头的图像
# 告诉opencv使用人脸识别分类器
face_detector = cv2.CascadeClassifier("D:\software\Python37\Aaa\haarcascade_frontalface_default.xml")
num = 0 # 图片的编号
while cap.isOpened(): # 当摄像头是打开的
ok, img = cap.read() # 读取视频 # 读取每一帧图片
grey_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 将图片转化为灰度图
# 人脸检测 检测出一帧图片中的每一个人脸的位置 faceRects是一个元组,存放每一个人脸的位置
faceRects = face_detector.detectMultiScale(grey_img, scaleFactor = 1.2,minNeighbors = 3,minSize= (70,70))
if len(faceRects) > 0: # 检测到人脸
for facerect in faceRects: # 遍历每一个人脸 可能一帧图片有多个人脸
x, y, w, h = facerect # 获取这张人脸的位置
#将当前帧保存为图片
if not os.path.exists(path_name): # 如果当前目录不存在
os.mkdir(path_name) # 创建这个目录
img_name = '%s/%d.jpg' %(path_name, num) # 给这张图片起一个名字
image = img[y-10:y+h+10, x-10:x+w+10] # 截取人脸部分扩大10像素的图片
cv2.imwrite(img_name, image) # 写入这张图片
num += 1 # 图片名加1
if num > (catch_pic_num): # 如果超过指定最大保存的数量退出循环
break
# 画出矩形框
cv2.rectangle(img, (x-10,y-10),(x+w-10,y+h-10),(0,255,0),2) # 给检测到的人脸画矩形
# 显示当前捕捉到了多少人脸图片,
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'num:%d'%(num),(x-30,y-30),font,1,(255,0,255),1) # 在图片上编辑字符
if num > (catch_pic_num):
break
# 显示图像
cv2.imshow('people',img)
c = cv2.waitKey(100)
if c & 0xff == ord('q'):
break
cap.release() # 释放摄像头资源
cv2.destroyAllWindows() # 释放窗口
if __name__ == '__main__':
CatchPICFromVideo(100,'data/luatao') # 获取100张图片,存放在data/luatao'目录中
执行过程:
执行结果: