在本教程中,您将学习如何在 Python 中应用人脸检测。 作为输入视频,我们将使用 Google Hangouts 视频。 网路上有大量的 Google Hangouts 视讯,在这些视讯中,人脸通常大到足以让软体侦测到人脸。
使用 OpenCV(Open Computer Vision)库实现面部检测。 最常见的面部检测方法是 haar 级联。已知该技术可以很好地与人脸检测配合使用。 您需要将级联文件(包含在 OpenCV 中)放在程序所在的目录中。
Python OpenCV 和视频
为了分析输入视频,我们提取每个帧。 每个帧显示的时间很短。 从这个基本程序开始:
#! /usr/bin/pythonimport cv2vc = cv2.VideoCapture('video.mp4')c=1fps = 24if vc.isOpened():rval , frame = vc.read()else:rval = Falsewhile rval:rval, frame = vc.read()cv2.imshow("Result",frame)cv2.waitKey(1000 / fps);vc.release()
执行后,您将看到没有声音播放的视频。(OpenCV 不支持声音)。在 while 循环内,我们将每个视频帧包含在可变帧内。
使用 OpenCV 进行人脸检测
我们将在脸部上方显示一个矩形。 为了避免矩形的闪烁,如果未检测到面部,我们将在最新的已知位置显示该矩形。
#! /usr/bin/pythonimport cv2face_cascade = cv2.CascadeClassifier('lbpcascade_frontalface.xml')vc = cv2.VideoCapture('video.mp4')if vc.isOpened():rval , frame = vc.read()else:rval = Falseroi = [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 = 0for (x,y,w,h) in faces:cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)nfaces = nfaces + 1roi = [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 resultcv2.imshow("Result",frame)cv2.waitKey(1);vc.release()
在此程序中,我们仅假设视频屏幕中只有一张脸。 我们减小了屏幕尺寸,以加快处理时间。 在大多数情况下,这很好,因为检测将在较低的分辨率下正常工作。 如果要“实时”执行人脸检测,则必须缩短计算周期。 此实现的替代方法是先处理,然后再显示。
该技术的局限性在于它不能始终检测到面部,并且可能无法检测到很小或被遮挡的面部。 它可能显示出误报,例如被检测为人脸的袋子。 这种技术在某些类型的输入视频上效果很好。
