利用OpenCV在图片和摄像头中检测人脸

本文主要介绍了如何利用OpenCV检测图片或摄像头视频中的人脸。

1 检测图片中人脸

import numpy as np
import cv2

#定义检测函数
def detect(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #定义级联检测器,并检测
    face_cascade = cv2.CascadeClassifier("cascades/haarcascade_frontalface_default.xml")
    faces = face_cascade.detectMultiScale(gray, 1.1, 5)
    #显示检测到的人脸
    for (x,y,w,h) in faces:
        img = cv2.rectangle(img, (x,y), (x+w,y+h), (0,0,255), 2)
    
    cv2.imshow("img", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

#读入一张照片并检测
img1 = cv2.imread("../fahai.jpg")
detect(img1)

2 从摄像头视频中检测人脸和眼睛

#定义视频检测人脸函数
def video_detect(cap, window, videoWriter): #(视频流对象,显示窗口,写出流对象)
    #定义级联检测器
    face_cascade = cv2.CascadeClassifier("cascades/haarcascade_frontalface_default.xml")
    eye_cascade = cv2.CascadeClassifier("cascades/haarcascade_eye.xml")
    
    ret, frame = cap.read() #提取一帧图像
    while(ret and cv2.waitKey(1)==-1):
        #对提取到的一帧图像进行检测
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray, 1.1, 5)
        
        #将检测框标在图像中
        for (x,y,w,h) in faces:
            frame = cv2.rectangle(frame, (x,y), (x+w,y+h), (0,0,255), 2)
            #从提取到的人脸中检测眼睛
            roi = gray[y:y+h, x:x+w]
            eyes = eye_cascade.detectMultiScale(roi, 1.03, 5, 0, (40,40))
            #将眼睛检测框画到图像中
            for (ex,ey,ew,eh) in eyes:
                frame = cv2.rectangle(frame,(x+ex,y+ey),(x+ex+ew,y+ey+eh),(0,255,0),2)
            
        cv2.imshow(window, frame) #显示图像
        videoWriter.write(frame) #图像保存
        ret, frame = cap.read()



import cv2 

cv2.namedWindow("myWindow") #创建一个窗口
#创建视频流对象和写出流对象
cap = cv2.VideoCapture(0)
fps = 15
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('myvideo2.mp4', 
                              cv2.VideoWriter_fourcc(*'mpeg'), fps, size)
#也可以写成字符格式cv2.VideoWriter_fourcc('m','p','4','v')

#开始检测
video_detect(cap, "myWindow", videoWriter)
#释放资源
cap.release()
videoWriter.release()
cv2.destroyAllWindows()

小结:

posted @ 2020-03-23 23:26  天地辽阔  阅读(589)  评论(0编辑  收藏  举报