使用网络摄像头在 Python 中进行人脸检测
#
本教程是Python 中的人脸识别的后续教程**,因此请确保您已经阅读了第一篇文章。
正如第一篇文章中提到的,通过网络摄像头从检测图像中的人脸到检测视频中的人脸非常容易——这正是我们将在本文中详细介绍的内容。
在评论部分提出任何问题之前:
- 不要跳过博客文章并尝试运行代码。您必须了解代码不仅要正确运行它,还要了解它的故障。
- 确保使用 OpenCV v2。
- 您需要一个有效的网络摄像头才能使此脚本正常工作。
- 查看其他评论/问题,因为您的问题可能已经得到解决。
谢谢你。
注意:另请查看我们关于使用 Python 进行人脸检测的更新教程。
先决条件
- 已安装 OpenCV(详见上一篇博文)
- 一个工作网络摄像头
编码
让我们直接进入代码,取自这个存储库。
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()
函数从视频源读取一帧,在本例中为网络摄像头。这将返回:
- 实际读取的视频帧(每个循环一帧)
- 一个返回码
返回码告诉我们是否已经用完了帧,如果我们从文件中读取就会发生这种情况。从网络摄像头读取时这无关紧要,因为我们可以永久记录,因此我们将忽略它。
# 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% 准确的。我们还没有达到 Robocop 以 100 英里/小时的速度驾驶他的摩托车可以使用低质量闭路电视摄像机追踪罪犯的阶段……还没有。
该代码逐帧搜索人脸,因此需要相当多的处理能力。例如,在我使用了 5 年的笔记本电脑上,它占用了几乎 90% 的 CPU。
下一步
好的,你知道如何检测人脸了。但是,如果您想检测自己的物体,例如汽车、电视或喜爱的玩具,该怎么办?
OpenCV 允许您创建自己的级联,但该过程没有很好的文档记录。这是一篇博客文章,向您展示了如何训练自己的级联来检测香蕉。
如果您想更进一步并识别个人面孔——也许是在许多陌生人中检测和识别您的面孔——这项任务非常困难。这主要是由于涉及大量的图像预处理。但是,如果您愿意应对挑战,则可以使用此处所述的机器学习算法。
还没有评论,来说两句吧...