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

173 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 使用网络摄像头在 Python 中进行人脸检测
> 原文:<https://realpython.com/face-detection-in-python-using-a-webcam/>
*本教程是 Python* *中* *[人脸识别的后续,所以确保你已经过了第一篇帖子。](https://realpython.com/face-recognition-with-python/)*
正如在第一篇文章中提到的,从检测图像中的人脸到通过网络摄像头检测视频中的人脸非常容易——这正是我们将在这篇文章中详细介绍的。
> 在评论区提问之前:
>
> 1. 不要跳过博客文章并试图运行代码。您必须理解代码的作用,不仅要正确运行它,还要对它进行故障排除。
> 2. 确保使用 OpenCV v2。
> 3. 您需要一个正常工作的网络摄像头,此脚本才能正常工作。
> 4. 查看其他评论/问题,因为您的问题可能已经得到解答。
>
> 谢谢你。
**免费奖励:** ,向您展示真实世界 Python 计算机视觉技术的实用代码示例。
**注意:**也可以查看我们的[更新教程,使用 Python 进行人脸检测](https://realpython.com/traditional-face-detection-python/)。
## 先决条件
1. OpenCV 已安装(详见之前的博文)
2. 正常工作的网络摄像头
[*Remove ads*](/account/join/)
## 代码
让我们直接进入从这个[库](https://github.com/shantnu/Webcam-Face-Detect)中取出的代码。
```py
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()
```
现在我们来分解一下…
```py
import cv2
import sys
cascPath = sys.argv[1]
faceCascade = cv2.CascadeClassifier(cascPath)
```
这个你应该很熟悉。我们正在创建一个面部层叠,就像我们在图像示例中所做的那样。
```py
video_capture = cv2.VideoCapture(0)
```
这一行将视频源设置为默认的网络摄像头OpenCV 可以很容易地捕捉到。
> **注意**:你也可以在这里提供一个文件名Python 会读入视频文件。然而,你需要安装 [ffmpeg](https://www.ffmpeg.org/) ,因为 OpenCV 本身不能解码压缩视频。Ffmpeg 充当 OpenCV 的前端,理想情况下,它应该直接编译到 OpenCV 中。这并不容易做到,尤其是在 Windows 上。
```py
while True:
# Capture frame-by-frame
ret, frame = video_capture.read()
```
在这里,我们捕捉视频。`read()`函数从视频源读取一帧,在本例中是网络摄像头。这将返回:
1. 实际视频帧读取(每个循环一帧)
2. 返回代码
返回代码告诉我们是否已经用完了帧,这在我们从文件中读取时会发生。当通过网络摄像头阅读时,这并不重要,因为我们可以永远记录,所以我们会忽略它。
```py
# 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)
```
同样,这段代码应该很熟悉。我们只是在捕捉的画面中寻找人脸。
```py
if cv2.waitKey(1) & 0xFF == ord('q'):
break
```
我们等待按下“q”键。如果是我们退出脚本。
```py
# When everything is done, release the capture
video_capture.release()
cv2.destroyAllWindows()
```
在这里,我们只是在清理。
## 测试!
[https://player.vimeo.com/video/100839478](https://player.vimeo.com/video/100839478)
所以,那是我手里拿着驾照。你可以看到这个算法同时跟踪真实的我和照片上的我。注意,我移动慢的时候,算法能跟上。但是,当我把我的手移到我的脸上时,它会混淆,把我的手腕误认为是一张脸。
就像我在上一篇文章中所说的,基于机器学习的算法很少是 100%准确的。我们还没有达到机械战警以每小时 100 英里的速度驾驶摩托车,用低质量的闭路电视摄像机追踪罪犯的阶段。
该代码逐帧搜索面部,因此需要相当大的处理能力。例如,在我用了五年的笔记本电脑上,它几乎占用了 90%的 CPU。
[*Remove ads*](/account/join/)
## 接下来的步骤
好吧,你知道如何识别人脸。但是,如果你想检测你自己的物体,比如你的汽车、电视或你最喜欢的玩具呢?
OpenCV 允许你创建自己的级联,但是这个过程并没有很好的记录。这里有一篇[博客](http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html)文章,向你展示如何训练你自己的级联来探测香蕉。
如果你想更进一步,识别每个人的脸——也许是在许多陌生人中发现和识别你的脸——这个任务是惊人的困难。这主要是由于涉及大量的图像预处理。但是,如果你愿意解决这个挑战,通过使用机器学习算法是可能的,如这里描述的。
**免费奖励:** ,向您展示真实世界 Python 计算机视觉技术的实用代码示例。
## 想了解更多?
在我接下来的课程中,将会更详细地介绍这一点,以及许多计算科学和机器学习的主题。该课程基于一个非常成功的 Kickstarter。
Kickstarter 已经结束,但你仍然可以在 [Python for Engineers](http://pythonforengineers.com/) 上订购课程。请访问了解更多信息。
此外,请在下面张贴您的视频链接,以获得我的直接反馈。有问题就评论。
哦——下次我们将讨论一些运动检测。敬请期待!**