功能:
1.实时获取摄像头,实时显示
2.利用opencv库,自动检测人脸和人眼
3.保存视频
import cv2 as cv
import numpy as np
# 实例化级联分类器,加载分类器
# 地址一定要\\,不然会报错
face_path='D:\\Anaconda3.5\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_default.xml'
face_cas = cv.CascadeClassifier(face_path)
face_cas.load(face_path)
eyes_path='D:\\Anaconda3.5\\Lib\\site-packages\\cv2\\data\\haarcascade_eye.xml'
eyes_cas = cv.CascadeClassifier(eyes_path)
eyes_cas.load(eyes_path)
# 1代表打开外置摄像头,外置多个摄像头可依此枚举 0,1,
# 0代表电脑内置摄像头,
camera = cv.VideoCapture(0)
# 设置摄像头分辨率 1920 *1080
width = 1920
heigth = 1080
camera.set(cv.CAP_PROP_FRAME_WIDTH, width)
camera.set(cv.CAP_PROP_FRAME_HEIGHT, heigth)
#创建保存视频的对象,设置编码格式,帧率,图片高宽等
out = cv.VideoWriter('faceeye.avi',
cv.VideoWriter_fourcc('M','J','P','G'),
10,
(width,heigth))
while (camera.isOpened()):
# 摄像头读取,ret为是否成功打开摄像头,true,false。
# frame为视频的每一帧图像
ret, frame = camera.read()
# 摄像头是和人对立的,将图像左右调换回来正常显示。
frame = cv.flip(frame, 1)
while not ret:# 如果获取失败
break # 结束本次循环
# 转灰度图
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
'''
rect = classifier.detectMultiScale(gray,scaleFactor,minNeighbors,minSize,maxsize)
参数:
Gray:要进行检测的人脸图像
scaleFactor:前后两次扫描中,搜索窗口的比例系数
minneighbors:目标至少被检测到minNeighbors次才会被认为是目标
minsize和maxsize:目标的最小尺寸和最大尺寸
'''
# 进行人脸和眼睛检测
faceRects = face_cas.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=4,minSize=(100,100))
if len(faceRects) == 0:# 如果获取失败
# print('没能检测出人脸')
continue # 结束本次循环
for faceRect in faceRects:
x,y,w,h = faceRect
# 框出人脸
img_addROI=cv.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),3
# 在识别出的人脸中进行眼睛检测
roi_gray = gray[y:y+h,x:x+w]
eyes = eyes_cas.detectMultiScale(roi_gray,scaleFactor=1.2,minNeighbors=10,minSize=(10,10))
for (ex,ey,ew,eh) in eyes:
img_addROI = cv.rectangle(img_addROI,(x+ex,y+ey),(x+ex+ew,y+ey+eh),(0,0,255),2)
# 显示图像
cv.imshow('fac_eye',img_addROI)
#保存图像
# out.write(img_addfaceeyes)
# cv2.waitKey(0) # 捕获并显示一帧,按键后捕获并显示新的一帧
#cv.waitKey(k),其中k太小就会非常快,太大播放的就会非常慢
# 0xFF == ord('q')
if cv.waitKey(25) & 0xFF == 27:
break # 结束当前循环
camera.release()
cv.destroyAllWindows()