Skip to content

Files

Latest commit

a3c5fe4 · Nov 20, 2019

History

History
85 lines (57 loc) · 3 KB

102.md

File metadata and controls

85 lines (57 loc) · 3 KB

Google Hangouts 视频中的人脸检测

原文: https://pythonspot.com/face-detection-in-video/

在本教程中,您将学习如何在 Python 中应用人脸检测。 作为输入视频,我们将使用 Google Hangouts 视频。 网路上有大量的 Google Hangouts 视讯,在这些视讯中,人脸通常大到足以让软体侦测到人脸。

使用 OpenCV(Open Computer Vision)库实现面部检测。 最常见的面部检测方法是 haar 级联。已知该技术可以很好地与人脸检测配合使用。 您需要将级联文件(包含在 OpenCV 中)放在程序所在的目录中。

Python OpenCV 和视频

为了分析输入视频,我们提取每个帧。 每个帧显示的时间很短。 从这个基本程序开始:

#! /usr/bin/python

import cv2

vc = cv2.VideoCapture('video.mp4')
c=1
fps = 24

if vc.isOpened():
    rval , frame = vc.read()
else:
    rval = False

while rval:
    rval, frame = vc.read()
    cv2.imshow("Result",frame)
    cv2.waitKey(1000 / fps);
    vc.release()

执行后,您将看到没有声音播放的视频。(OpenCV 不支持声音)。在 while 循环内,我们将每个视频帧包含在可变帧内。

使用 OpenCV 进行人脸检测

我们将在脸部上方显示一个矩形。 为了避免矩形的闪烁,如果未检测到面部,我们将在最新的已知位置显示该矩形。

#! /usr/bin/python

import cv2

face_cascade = cv2.CascadeClassifier('lbpcascade_frontalface.xml')
vc = cv2.VideoCapture('video.mp4')

if vc.isOpened():
    rval , frame = vc.read()
else:
    rval = False

roi = [0,0,0,0]

while rval:
    rval, frame = vc.read()

    # resize frame for speed.
    frame = cv2.resize(frame, (300,200))

    # face detection.
    faces = face_cascade.detectMultiScale(frame, 1.8, 2)
    nfaces = 0
    for (x,y,w,h) in faces:
    cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
    nfaces = nfaces + 1
    roi = [x,y,w,h]

    # undetected face, show old on position.
    if nfaces == 0:
        cv2.rectangle(frame,(roi[0],roi[1]),(roi[0]+roi[2],roi[1]+roi[3]),(0,0,255),2)

    # show result
    cv2.imshow("Result",frame)
    cv2.waitKey(1);
    vc.release()

在此程序中,我们仅假设视频屏幕中只有一张脸。 我们减小了屏幕尺寸,以加快处理时间。 在大多数情况下,这很好,因为检测将在较低的分辨率下正常工作。 如果要“实时”执行人脸检测,则必须缩短计算周期。 此实现的替代方法是先处理,然后再显示。

该技术的局限性在于它不能始终检测到面部,并且可能无法检测到很小或被遮挡的面部。 它可能显示出误报,例如被检测为人脸的袋子。 这种技术在某些类型的输入视频上效果很好。

下载计算机视觉示例和课程