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

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

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

Python OpenCV 和视频

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

  1. #! /usr/bin/python
  2. import cv2
  3. vc = cv2.VideoCapture('video.mp4')
  4. c=1
  5. fps = 24
  6. if vc.isOpened():
  7. rval , frame = vc.read()
  8. else:
  9. rval = False
  10. while rval:
  11. rval, frame = vc.read()
  12. cv2.imshow("Result",frame)
  13. cv2.waitKey(1000 / fps);
  14. vc.release()

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

使用 OpenCV 进行人脸检测

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

  1. #! /usr/bin/python
  2. import cv2
  3. face_cascade = cv2.CascadeClassifier('lbpcascade_frontalface.xml')
  4. vc = cv2.VideoCapture('video.mp4')
  5. if vc.isOpened():
  6. rval , frame = vc.read()
  7. else:
  8. rval = False
  9. roi = [0,0,0,0]
  10. while rval:
  11. rval, frame = vc.read()
  12. # resize frame for speed.
  13. frame = cv2.resize(frame, (300,200))
  14. # face detection.
  15. faces = face_cascade.detectMultiScale(frame, 1.8, 2)
  16. nfaces = 0
  17. for (x,y,w,h) in faces:
  18. cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
  19. nfaces = nfaces + 1
  20. roi = [x,y,w,h]
  21. # undetected face, show old on position.
  22. if nfaces == 0:
  23. cv2.rectangle(frame,(roi[0],roi[1]),(roi[0]+roi[2],roi[1]+roi[3]),(0,0,255),2)
  24. # show result
  25. cv2.imshow("Result",frame)
  26. cv2.waitKey(1);
  27. vc.release()

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

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

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