您是否想知道计算机如何从视频流中找到进行处理所需的对象?乍一看,这看起来像是一项“繁重的”编程任务,需要使用大量来自数学分析,离散数学等的公式,需要大量的知识才能至少在识别世界中编写一个像“ Hello,world”这样的小程序。视频上的图像。而且,如果您被告知实际上进入计算机视觉世界现在要容易得多,并且在阅读了本文之后,您可以编写自己的程序,该程序可以教您的计算机查看和检测人脸?此外,在本文结尾处,您还将发现可以使用计算机视觉提高PC安全性的好处。
为了使您的计算机开始了解您正在向其显示外观,我们需要:
- 电脑;
- 网络摄像头;
- Python 3;
- 您最喜欢的代码编辑器(PyCharm,Jupyter等)。
因此,在根据上面的列表收集了所需的一切之后,我们可以开始直接编写用于面部识别的程序。
首先,使用命令行中的命令下载必要的Python库:
pip install opencv-python; numpy
简要说明为什么需要它们:
OpenCV。该库是几乎每个现代计算机视觉项目的基础。它包含数百种计算机视觉和图像处理算法。它最初是用C / C ++编写的,但由于对这种语言的巨大需求,后来也用Python进行了重写。
脾气暴躁。将有助于OpenCV库的内部计算。
完成所需的库安装后,打开我们喜欢的代码编辑器并开始编写程序:
附加OpenCV计算机视觉库
import cv2 as cv
2.我们使用VideoCapture(索引)方法从网络摄像机捕获视频流,其中index是系统中网络摄像机的序列号。如果只有一台摄像机,则该参数等于0。
capture = cv.VideoCapture(0)
3.要获取视频,我们将使用read()方法,该方法将向我们返回rtrn标志-显示成功从视频流和图像捕获帧-视频流(numpy数组)的帧。我们将连续不断地从视频流中读取数据,直到按下Escape键。
while True:
rtrn, image = capture.read()
cv.imshow("Capture from Web-camera", image) #
if cv.waitKey(1) == 27: # Esc
break
capture.release()
cv.destroyAllWindows()
我们保存文件,使用python our_file_name.py从命令行运行。现在我们的程序能够从网络摄像机接收视频流了!这意味着计算机已经可以识别人脸了。
4.让我们使计算机也可以将视频写入文件:
指定用于保存视频的编解码器,指定保存的文件的名称,fps和大小。对于我们的任务,我们采用XVID编解码器。
import cv2 as cv
capture = cv.VideoCapture(0)
codec = cv.VideoWriter_fourcc(*'XVID')
5.我们依次将帧输出到视频窗口,然后将结果保存到输出变量。然后,在视频流结束之后,来自输出的数据将被传输到文件“ saved_from_camera.avi”:
output = cv.VideoWriter('saved_from_camera.avi ', codec, 25.0, (640, 480))
while capture.isOpened():
rtrn, image = capture.read()
if cv.waitKey(1) == 27 or rtrn == False:
break
cv.imshow('video for save', image)
output.write(image)
output.release()
capture.release()
cv.destroyAllWindows()
了解了如何从网络摄像机拍摄视频并将其保存到文件后,我们可以继续进行最有趣的事情-视频流中的人脸识别。为了在帧中找到人脸,我们将使用所谓的Haar Features。它们的本质是,如果我们在图像中采用矩形区域,则通过相邻矩形像素之间的强度差异,我们可以区分出人脸固有的特征。
例如,在带有脸部的图像中,眼睛周围的区域比脸颊周围的区域更暗。因此,脸部的Haar标志之一可以在脸颊和眼睛处称为2个相邻的矩形。
还有许多其他更快,更准确的方法可以检测图像中的对象,但是要了解一般原理,我们现在仅需要了解Haar信号。
OpenCV的开发人员已经开展了确定Haar标志的工作,并向所有人提供了视频流处理能力的结果。
让我们开始从网络摄像头编写一个面部检测器:
6.首先,获得Haar功能并定义用于捕获视频流的参数。Traits文件位于Python库的安装路径中。默认情况下,它们位于文件夹中
C:/Python3X/Lib/sitepackages/cv2/data/haarcascade_frontalface_default.xml
其中X是您的Python 3颠覆版本。
import cv2 as cv
cascade_of_face = cv.CascadeClassifier('C:/Python3.X/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml ')
capture = cv.VideoCapture(0)
capture.set(cv.CAP_PROP_FPS, 25) # 25
7.接下来,在循环中,我们将轮流从网络摄像机读取帧并将其传输到面部检测器:
while True:
rtrn, image = capture.read()
gr = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
faces_detect = cascade_of_face.detectMultiScale(
image=gr,
minSize=(15, 15),
minNeighbors=10,
scaleFactor=1.2
)
for (x_face, y_face, w_face, h_face) in faces_detect:
cv.rectangle(image, (x_face, y_face), (x_face + w_face, y_face + h_face), (0, 0, 255), 2)
cv.imshow("Image", image)
if cv.waitKey(1) == 27: # Esc key
break
capture.release()
cv.destroyAllWindows()
8.现在,让我们将所有内容组合为一个整体,并获得一个程序,该程序可以捕获来自网络摄像机的视频,识别出其面部并将其保存到文件中:
import cv2 as cv
faceCascade = cv.CascadeClassifier('C:/Users/Zet/Desktop/Python/test_opencv/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')
capture = cv.VideoCapture(0)
capture.set(cv.CAP_PROP_FPS, 25)
codec = cv.VideoWriter_fourcc(*'XVID')
output = cv.VideoWriter('saved_from_camera.avi', codec, 25.0, (640, 480))
while True:
rtrn, image = capture.read()
gr = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
faces_detect = faceCascade.detectMultiScale(
image=gr,
minSize=(15, 15),
minNeighbors=10,
scaleFactor=1.2
)
for (x_face, y_face, w_face, h_face) in faces_detect:
cv.rectangle(image, (x_face, y_face), (x_face + w_face, y_face + h_face), (255, 0, 0), 2)
cv.imshow("Image", image)
output.write(image)
if cv.waitKey(1) == 27: # Esc key
break
output.release()
capture.release()
cv.destroyAllWindows()
所有!您已经编写了一个程序,这是了解计算机外观的第一步。此外,例如,您可以改善人脸识别,以便计算机通过训练神经网络来识别视频中的某些人。您也可以编写检测器,该检测器配置为能够分析更复杂的对象(例如,跟踪流量)。并解决其他同样重要的计算机视觉任务。
奖金
让我们在实践中应用该程序-我们将跟踪该帐户下的登录信息。
- 让我们转到任务计划程序(可以通过标准的Windows搜索找到);
- 让我们创建一个简单任务,给它一个标题和简短描述;
3.单击下一步,然后转到触发器项。在这里,我们选择将在其中启动任务的事件。我们选择“进入Windows时”;
4.接下来,在操作中,我们指示“运行程序”;
5.在“操作”中,指定python.exe的路径,在“参数”中,指定程序的路径:
完成!结果,在登录时,将记录在该帐户下登录的人,并保存视频。因此,您可以在缺席的情况下跟踪谁在计算机上工作,同时保留证据记录。