三步即可实现!使用网络摄像头在 Python 中进行人脸检测

1,218 阅读3分钟

正如上一篇文章中提到的,通过网络摄像头从检测图像中的人脸到检测视频中的人脸非常容易——这正是我们将在本文中详细介绍的内容。

准备工作

  • 已安装 OpenCV(详见上一篇博文)
  • 一个工作网络摄像头

编码

让我们直接深入研究代码,如下:

import cv2
import sys

cascPath = sys.argv
faceCascade = cv2.CascadeClassifier(cascPath)

video_capture = cv2.VideoCapture(0)

while True:
    # Capture frame-by-frame
    ret, frame = video_capture.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=cv2.cv.CV_HAAR_SCALE_IMAGE
    )

    # Draw a rectangle around the faces
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # Display the resulting frame
    cv2.imshow('Video', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything is done, release the capture
video_capture.release()
cv2.destroyAllWindows()

现在让我们分解一下……

import cv2
import sys

cascPath = sys.argv[1]
faceCascade = cv2.CascadeClassifier(cascPath)

这对大家来说应该很熟悉。 我正在创建一个人脸级联,就像在图像示例中所做的那样。

video_capture = cv2.VideoCapture(0)

注意:你也可以在此处提供文件名,Python 将读取视频文件。 但是,你需要为此安装 ffmpeg,因为 OpenCV 本身无法解码压缩视频。 Ffmpeg 充当 OpenCV 的前端,理想情况下,它应该直接编译到 OpenCV 中。 这并不容易做到,尤其是在 Windows 上。

while True:
    # Capture frame-by-frame
    ret, frame = video_capture.read()

在这里,我们可捕获视频。 read() 函数从视频源读取一帧,在本例中是网络摄像头。 这将返回:

  • 实际读取的视频帧(每个循环一帧)
  • 一个返回码

返回码告诉我们是否已经用完了帧,如果我们从文件中读取就会发生这种情况。 从网络摄像头读取时这无关紧要,因为我们可以永久记录,因此我们将忽略它。

  # Capture frame-by-frame
    ret, frame = video_capture.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30, 30),
        flags=cv2.cv.CV_HAAR_SCALE_IMAGE
    )

    # Draw a rectangle around the faces
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

    # Display the resulting frame
    cv2.imshow('Video', frame)

同样,这段代码应该很熟悉。 我们只是在我们捕获的帧中搜索人脸。

if cv2.waitKey(1) & 0xFF == ord('q'):
    break

我们等待按下“q”键。 如果是,我们退出脚本。

# When everything is done, release the capture
video_capture.release()
cv2.destroyAllWindows()

就像在上一篇文章中所说的,基于机器学习的算法很少是 100% 准确的。 该代码逐帧搜索人脸,因此需要相当多的处理能力。 例如,在我使用了 5 年的笔记本电脑上,它占用了几乎 90% 的 CPU。

下一步

好的,你知道如何检测人脸了。 但是,如果想检测自己的物体,例如汽车、电视或最喜欢的玩具,该怎么办?

OpenCV 允许创建自己的级联,但该过程没有很好的文档记录。 如果想更进一步并识别个人面孔——也许是在许多陌生人中检测和识别你的面孔——这项任务非常困难。 这主要是由于涉及大量的图像预处理。 但是,如果你愿意应对挑战,则可以使用此处所述的机器学习算法,如下:

​http://scikit-learn.sourceforge.net/0.6/auto_examples/applications/plot_face_recognition.html​

我们开发了支持提供多种协议设备接入的视频平台EasyCVR,前期我们做好了EasyCVR在视频能力上的各项铺垫,包括摄像头的云台控制、语音对讲、告警上报等功能,现在我们踏入了人脸识别的领域,目前也正在测试视频平台的人脸识别功能,如果大家感兴趣可以翻阅我们以前的博文了解一下,欢迎大家关注。