本次要学视频检测,我们先回顾一下图片的人脸检测建筑兔零基础自学python记录16|实战人脸识别项目——人脸检测05-CSDN博客
我们先把上文中代码复制出来,保留红框的部分。
然后我们来看一下源代码:
import cv2 as cvdef face_detect_demo(img):gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)face_detect = cv.CascadeClassifier('M:/python/pythoninstall/Lib/site-packages/cv2/data/haarcascade_frontalface_alt.xml')face = face_detect.detectMultiScale(gary)for x,y,w,h in face:cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)cv.imshow('result',img)#读取摄像头
cap = cv.VideoCapture(0)
#循环
while True:flag,frame = cap.read()if not flag:breakface_detect_demo(frame)if ord('q') == cv.waitKey(1):breakcv.destroyAllWindows()#释放摄像头
cap.release()
依次进行解读:
(1)cv.VideoCapture()
可以接受一个参数,用于指定视频源:
- 整数类型:表示摄像头设备的编号,从
0
开始。例如,cv.VideoCapture(0)
表示打开默认的摄像头。 - 字符串类型:表示本地视频文件的路径或网络视频流的 URL。例如,
cv.VideoCapture('video.mp4')
表示打开名为video.mp4
的本地视频文件。
#举例:
#(1)导入视频路径
cap = cv.VideoCapture('http://example.com/stream.m3u8')
cap = cv.VideoCapture('path/to/your/video.mp4')
#(2)导入摄像头
cv.VideoCapture(0)
(2)flag,frame=cap.read()
从指定的视频源(可以是摄像头、本地视频文件或者网络视频流)中读取一帧图像。
每次调用时它会尝试从视频源中获取当前的视频帧,并将其作为一个图像对象返回。
该方法返回两个值,通过元组解包的方式分别赋值给 flag
和 frame
:
flag
:一个布尔类型的值,用于指示是否成功读取到视频帧。
如果成功读取到帧,flag
的值为 True
;
如果失败(例如视频结束、视频源断开连接等情况),flag
的值为 False
。
frame
:一个 NumPy
数组,表示读取到的视频帧图像。
该数组的形状通常为 (高度, 宽度, 通道数)
,通道数一般为 3(代表 RGB 三个颜色通道),图像的像素值范围通常是 0 到 255。
补充:在这里我们会发现flag,frame两个值不是写在括号里的,反而是在=之前的。这和我们之前熟悉的
cv.cvtColor(img,cv.COLOR_BGR2GRAY)这样括号里的写法有什么区别呢?
括号里的值=x,例如数学里见过的sin(x)。
所以 cv.cvtColor(img,cv.COLOR_BGR2GRAY)中我们可理解为: x1=img,x2=cv.COLOR_BGR2GRAY
等于号左边的值=y,例如数学里见过的y=sin(x)
所以flag,frame=cap.read()
我们可理解为:
y1=flag,y2=frame
(3)解读循环代码
#本次视频识别代码
while True:flag,frame = cap.read()if not flag:breakface_detect_demo(frame)if ord('q') == cv.waitKey(1):break#对比:之前图像识别代码
while True:if ord('q') == cv.waitKey(0):break
对比之后可以看到增加的代码主要是关于flag和frame的,其中flag:读帧与否,frame:帧。这一段代码其实执行了两个循环命令,即下图中的蓝框和红框。
由此可以看到两个循环:
1.持续读帧
2.对帧检测人脸
在这段循环中还有两个调用,如下图:
1.调用摄像头
2.调用人脸识别参数
综上我们可以对整个代码有了整体的结构掌握:
让我们打开屏幕摄像头试试~
可以看到已经可以识别屏幕中手机中的人脸照片了,并且随着移动可以动态识别。
接着我们尝试导入一段视频试一下~
首先获取一段视频,然后保存到py的workspace
将路径输入代码,运行即可。
可以看到成功识别了节目中的人物~可以点击视频进行观看~
人脸识别测试
(4)总结:
cv.VideoCapture()视频路径
flag,frame=cap.read()读取视频,
flag:读帧与否,frame:帧