OpenCV3 视频中的人脸检测

视频里的人脸检测跟静态图片中的差不多,只是需要调用摄像头。

import cv2
def detect():                       
    face_cascade  = cv2.CascadeClassifier(
        'cascades/haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier(
        'cascades/haarcascade_eye.xml')
    camera = cv2.VideoCapture(0)    #初始化摄像头,参数传递的是要使用的第几个摄像头

    while True:
        ret, frame = camera.read()  #read()函数返回两个值,第一个布尔值用于判断是否检测到帧,第二个为帧
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  #捕捉到帧后将其转为灰度图像(OpenCV基于灰度色彩空间)

        faces = face_cascade.detectMultiScale(gray, 1.3, 5)

        for  (x, y, w, h) in faces:
            img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)  # 蓝色矩形框
            eyes = eye_cascade.detectMultiScale(gray, 1.2, 5,0,(5,5))       #直接传值的话需要多传一个flags值,否则报错

            font = cv2.FONT_ITALIC          
            cv2.putText(frame, 'xzb', (x -10, y - 10), font, 1, (255, 0, 255), 2)
            #在人脸框上显示文本1-图片,2-文本,3-位置,4-字体,5-大小,6-颜色,7-线宽

            for (ex, ey, ew, eh) in eyes:
                cv2.rectangle(img, (ex,ey),(ex+ew,ey+eh),(0,255,0),2)   #绿色矩形框

            cv2.imshow('camera',frame)

        if cv2.waitKey(100) & 0xff == ord ('q'):
            break

    camera.release()
    cv2.destroyAllWindows()

if __name__ =='__main__':        
    detect()

 结果:

 

face_cascade  = cv2.CascadeClassifier(
        'cascades/haarcascade_frontalface_default.xml')
    eye_cascade = cv2.CascadeClassifier(
        'cascades/haarcascade_eye.xml')

 这里加载了两个分类器,一个是用于检测脸,一个是检测眼睛

 

camera = cv2.VideoCapture(0)

初始化摄像头,参数传递的是要使用的第几个摄像头

 

        for  (x, y, w, h) in faces:
            img = cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)  # 蓝色矩形框
            eyes = eye_cascade.detectMultiScale(gray, 1.2, 5,0,(5,5))  #直接传值的话需要多传一个flags值,否则报错
            font = cv2.FONT_ITALIC          #字体
            cv2.putText(frame, 'xzb', (x -10, y - 10), font, 1, (255, 0, 255), 2)
            #在人脸框上显示文本1-图片,2-文本,3-位置,4-字体,5-大小,6-颜色,7-线宽

            for (ex, ey, ew, eh) in eyes:
                cv2.rectangle(img, (ex,ey),(ex+ew,ey+eh),(0,255,0),2)   #绿色矩形框
cv2.imshow('camera',frame)

 这里是将每一帧检测到脸的图片进行眼睛检测。这样相比整张图片检测眼可以减少计算量,提高运算速度。

        if cv2.waitKey(100) & 0xff == ord ('q'):
            break

    camera.release()
    cv2.destroyAllWindows()

if __name__ =='__main__':         
    detect()

 输入q退出,不然摄像头一直会调用。

if __name__ =='__main__':         
    detect()是为了防止这个py文件被导入时执行。

总的来说视频检测与图像检测没有太大区别,就是将视频分割成一帧帧图片再进行处理。
posted @ 2019-01-09 21:06  Pinocchio0-0  阅读(408)  评论(0编辑  收藏  举报