python-opencv 实时视频/人脸人眼检测/实时显示

功能:

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()




















猜你喜欢

转载自blog.csdn.net/qq_45384162/article/details/129278932