【youcans 的 OpenCV 例程 300篇】252. 视频文件的读取与保存
视频文件是由一系列图像组成的,视频的每一帧都是一幅图像。
OpenCV提供了VideoCapture类和VideoWriter类处理视频流,既可以处理视频文件,也可以处理摄像头设备。
函数原型
cv.VideoCapture( index[, apiPreference] ) → <VideoCapture object>
cv.VideoCapture(filename[, apiPreference]) → <VideoCapture object>
cv.VideoWriter([filename, fourcc, fps, frameSize[, isColor]]) → <VideoWriter object>
VideoCapture类用于读取视频文件、视频流或从摄像机捕获视频,VideoWriter类用于视频文件的写入和保存。
构造函数cv.VideoCapture和cv.VideoWrite用于实现类的初始化。
参数说明:
● index:摄像头的 ID 编号,0 表示默认后端打开默认摄像机
● filename:读取或保存的视频文件的路径,包括扩展名
● apiPreference:读取视频流的属性设置
● fourcc:用于压缩帧的编码器/解码器的字符代码,
- CV_FOURCC(‘I’,‘4’,‘2’,‘0’),未压缩的YUV编码格式,扩展名为 .avi
- CV_FOURCC(‘P’,‘I’,‘M’,‘1’),MPEG-1 编码格式,扩展名为 .avi
- CV_FOURCC( ‘X’,‘V’,‘I’,‘D’),MPEG-4 编码格式,扩展名为 .avi
- CV_FOURCC( ‘F’,‘L’,‘V’,‘I’),Flash 编码格式,件扩展名为 .flv
● fps:视频流的帧速率
● frameSize:元组 (w, h),视频帧的宽度和高度
● isColor:是否彩色图像
成员函数:
- cv.VideoCapture.isOpened(),检查视频捕获是否初始化成功
- cv.VideoCapture.read(),捕获视频文件、视频流或捕获的视频设备
- cv.VideoCapture.release(),关闭视频文件或设备,释放对象
- cv.VideoCapture.get(propId) ,获取 VideoCapture 类对象的属性
- cv.VideoCapture.set(propId, value),设置 VideoCapture 类对象的属性
- cv.VideoWriter.fourcc(c1, c2, c3, c4[, ]),构造编码器/解码器的fourcc代码
- cv.VideoWriter.write(image[, ]),写入下一帧视频
- cv.VideoWriter.release(),关闭视频写入,释放对象
注意问题:
- ⒈读取视频文件、视频流中读取时,通过 filename 传递视频文件、视频流的路径。使用摄像头时,通过 index 传递摄像头的 ID 号。
- ⒉使用摄像头时,index=0 表示默认后端打开默认摄像机,例如笔记本内置摄像头。可以使用计算机的内置或外接的摄像头,也支持本地网络或公共网络的 IP 摄像机。
- ⒊视频写入类VideoWriter的参数frameSize是元组 (w, h),即视频帧的宽度和高度,而OpenCV图像的形状是 (h, w),注意二者的顺序是反的。
- ⒋视频处理过程较为复杂,一些程序设置与具体系统环境有关,本文只介绍基本的成员函数,通用的处理方法。更多内容详见:[https://docs.opencv.org/]。
- ⒌视频处理中的很多问题涉及摄像机和计算机的硬件设备,需要结合具体系统环境来分析。
【例程0106】视频文件的读取、播放和保存
本例程示例读取和播放计算机中的视频文件,每隔若干帧抽取一帧保存为新的视频文件。
-
视频读取的基本步骤为:
(1)创建视频读取/捕获对象;
(2)获取视频的一帧图像;
(3)检查视频获取是否成功;
(4)释放视频读取/捕获对象。 -
保存视频文件的基本步骤为:
(1)设置写入视频的格式和参数;
(2)创建视频写入对象;
(3)写入一帧图像;
(4)释放视频写入对象。
# 【0106】视频文件的读取、播放和保存
import cv2 as cv
if __name__ == '__main__':
# 创建视频读取/捕获对象
vedioRead = "../images/nasa_m420p.mov" # 读取视频文件的路径
capRead = cv.VideoCapture(vedioRead) # 实例化 VideoCapture 类
# 设置写入视频图像的高,宽,帧速率和总帧数
width = int(capRead.get(cv.CAP_PROP_FRAME_WIDTH)) # 960
height = int(capRead.get(cv.CAP_PROP_FRAME_HEIGHT)) # 540
fps = round(capRead.get(cv.CAP_PROP_FPS)) # 30
frameCount = int(capRead.get(cv.CAP_PROP_FRAME_COUNT)) # 1826
print(height, width, fps, frameCount)
# 创建写入视频对象
# fourcc = cv.VideoWriter_fourcc('X', 'V', 'I', 'D') # 编码器设置 XVID
fourcc = cv.VideoWriter_fourcc(*'XVID') # 'X','V','I','D' 简写为 *'XVID'
vedioWrite = "../images/nasa.avi" # 写入视频文件的路径
capWrite = cv.VideoWriter(vedioWrite, fourcc, fps, (width, height))
# 读取视频文件,抽帧写入视频文件
frameNum = 0 # 视频帧数初值
timef = 30 # 设置抽帧间隔
while capRead.isOpened(): # 检查视频捕获是否成功
ret, frame = capRead.read() # 读取下一帧视频图像
if ret is True:
frameNum += 1 # 读取视频的帧数
cv.imshow(vedioRead, frame) # 播放视频图像
if (frameNum % timef == 0): # 判断抽帧条件
capWrite.write(frame) # 将当前帧写入视频文件
if cv.waitKey(1) & 0xFF == ord('q'): # 按 'q' 退出
break
else:
print("Can't receive frame at frameNum {}".format(frameNum))
break
capRead.release() # 关闭读取视频文件
capWrite.release() # 关闭视频写入对象
cv.destroyAllWindows() # 关闭显示窗口
【本节完】
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/127333535)
Copyright 2022 youcans, XUPT
Crated:2022-12-15
转载:https://blog.csdn.net/youcans/article/details/125226884