前言
当我们谈论计算机视觉时,我们常常会涉及到处理图像和处理视频两个不同的领域。在上一节课中,我们学习了如何处理静态图像,即一张张静止的图像。而在本节课中,我们将探讨如何处理视频。
一、视频是什么?
当我在一本空白的书上绘制了一系列连续的图画时,快速翻动这本书会产生动画的效果。视频也是类似的,你可以把视频想象成一个包含许多图片的文件,其中每张图片都被称为一帧。因此,视频实际上是由连续的图像帧组成的数字序列。
二、读取视频
OpenCV 提供了 函数,用于从摄像头、视频文件或网络摄像头中获取视频流。通过传递设备索引或视频文件的路径作为参数,可以创建一个 VideoCapture 对象。
我们在前面第一个程序中使用到了视频流的读取,当时我们是读取的摄像头。我们看下具体如何使用VideoCapture
代码如下(示例):
# 从视频文件读取
video_file_path = "video.mp4" # 视频文件路径
cap = cv2.VideoCapture(video_file_path)
# 从摄像头读取
# cap = cv2.VideoCapture(0) # 0 表示默认摄像头,如果有多个摄像头,可以使用不同的索引值来选择
返回的是VideoCapture 对象,我们还需要调用read读取
ret, frame = cap.read()
这样就读取了视频的具体内容,其实我们上面的代码 读取的是视频的第一帧 ,每次调用read就会读取一帧,所以实际使用我们可以循环读取
# 逐帧读取视频
while True:
# 读取一帧
ret, frame = cap.read()
# 检查是否成功读取帧
if not ret:
print("无法读取视频帧")
break
# 在这里对帧进行处理,例如显示、保存、处理等
# 显示帧
cv2.imshow("Frame", frame)
# 按下 'q' 键退出循环
if cv2.waitKey(25) & 0xFF == ord('q'):
break
这样我们可以对frame进行处理,相当于对视频的每一张图片进行处理 从而达到对视频的处理。;例如我们可以翻转视频
# 反转
flip_frame = cv2.flip(frame, -1) # 水平和垂直翻转
或者像我们前面写的demo,读取视像头后,可以对视频中的手部进行识别跟踪。
处理完可以通过imshow去展示我们修改后的结果。
if cv2.waitKey(25) & 0xFF == ord('q'):
break
上面的waitkey()函数的作用是等待用户按键输入,最多等待 25 毫秒。如果在等待时间内有按键按下,则返回按键的 ASCII 值,因为waitKey是在循环内部的,所以这行代码 作用就是没读取一帧就等待25毫米 并且检测有没有按键输入,如果有按键输入并且为q 则break。
退出循环后注意要释放一下资源
# 释放资源
cap.release()
cv2.desoyAllWindows()
至此我们视频读取与操作的基础已经说完了。