geekdoc-python-zh/docs/realpython/face-detection-in-python-us...

6.3 KiB
Raw Permalink Blame History

使用网络摄像头在 Python 中进行人脸检测

原文:https://realpython.com/face-detection-in-python-using-a-webcam/

本教程是 Python 人脸识别的后续,所以确保你已经过了第一篇帖子。

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

在评论区提问之前:

  1. 不要跳过博客文章并试图运行代码。您必须理解代码的作用,不仅要正确运行它,还要对它进行故障排除。
  2. 确保使用 OpenCV v2。
  3. 您需要一个正常工作的网络摄像头,此脚本才能正常工作。
  4. 查看其他评论/问题,因为您的问题可能已经得到解答。

谢谢你。

免费奖励: ,向您展示真实世界 Python 计算机视觉技术的实用代码示例。

**注意:**也可以查看我们的更新教程,使用 Python 进行人脸检测

先决条件

  1. OpenCV 已安装(详见之前的博文)
  2. 正常工作的网络摄像头

Remove ads

代码

让我们直接进入从这个中取出的代码。

import cv2
import sys

cascPath = sys.argv[1]
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)

这一行将视频源设置为默认的网络摄像头OpenCV 可以很容易地捕捉到。

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

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

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

  1. 实际视频帧读取(每个循环一帧)
  2. 返回代码

返回代码告诉我们是否已经用完了帧,这在我们从文件中读取时会发生。当通过网络摄像头阅读时,这并不重要,因为我们可以永远记录,所以我们会忽略它。

 # 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()

在这里,我们只是在清理。

测试!

https://player.vimeo.com/video/100839478

所以,那是我手里拿着驾照。你可以看到这个算法同时跟踪真实的我和照片上的我。注意,我移动慢的时候,算法能跟上。但是,当我把我的手移到我的脸上时,它会混淆,把我的手腕误认为是一张脸。

就像我在上一篇文章中所说的,基于机器学习的算法很少是 100%准确的。我们还没有达到机械战警以每小时 100 英里的速度驾驶摩托车,用低质量的闭路电视摄像机追踪罪犯的阶段。

该代码逐帧搜索面部,因此需要相当大的处理能力。例如,在我用了五年的笔记本电脑上,它几乎占用了 90%的 CPU。

Remove ads

接下来的步骤

好吧,你知道如何识别人脸。但是,如果你想检测你自己的物体,比如你的汽车、电视或你最喜欢的玩具呢?

OpenCV 允许你创建自己的级联,但是这个过程并没有很好的记录。这里有一篇博客文章,向你展示如何训练你自己的级联来探测香蕉。

如果你想更进一步,识别每个人的脸——也许是在许多陌生人中发现和识别你的脸——这个任务是惊人的困难。这主要是由于涉及大量的图像预处理。但是,如果你愿意解决这个挑战,通过使用机器学习算法是可能的,如这里描述的。

免费奖励: ,向您展示真实世界 Python 计算机视觉技术的实用代码示例。

想了解更多?

在我接下来的课程中,将会更详细地介绍这一点,以及许多计算科学和机器学习的主题。该课程基于一个非常成功的 Kickstarter。

Kickstarter 已经结束,但你仍然可以在 Python for Engineers 上订购课程。请访问了解更多信息。

此外,请在下面张贴您的视频链接,以获得我的直接反馈。有问题就评论。

哦——下次我们将讨论一些运动检测。敬请期待!**