正如上一篇文章中提到的,通过网络摄像头从检测图像中的人脸到检测视频中的人脸非常容易——这正是我们将在本文中详细介绍的内容。
准备工作
- 已安装 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在视频能力上的各项铺垫,包括摄像头的云台控制、语音对讲、告警上报等功能,现在我们踏入了人脸识别的领域,目前也正在测试视频平台的人脸识别功能,如果大家感兴趣可以翻阅我们以前的博文了解一下,欢迎大家关注。