在本教程中,您将学习如何在 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()
在此程序中,我们仅假设视频屏幕中只有一张脸。 我们减小了屏幕尺寸,以加快处理时间。 在大多数情况下,这很好,因为检测将在较低的分辨率下正常工作。 如果要“实时”执行人脸检测,则必须缩短计算周期。 此实现的替代方法是先处理,然后再显示。
该技术的局限性在于它不能始终检测到面部,并且可能无法检测到很小或被遮挡的面部。 它可能显示出误报,例如被检测为人脸的袋子。 这种技术在某些类型的输入视频上效果很好。