《数字图像处理-OpenCV/Python》连载(7)视频文件的读取与保存
本书京东优惠购书链接:https://item.jd.com/14098452.html
本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html
第1章 图像的基本操作
为了方便初学者从零开始学习OpenCV-Python,本书从图像的读取、保存和显示等基本操作开始介绍,使读者可以循序渐进地使用和理解本书的每一个例程。
1.4 视频文件的读取与保存
视频文件是由一系列图像组成的,视频的每一帧都是一幅图像。
OpenCV中的VideoCapture类和VideoWriter类处理视频流,既可以处理视频文件,也可以处理摄像头设备。
VideoCapture类用于读取视频文件、视频流或从摄像头捕获视频;VideoWriter类用于视频文件的写入和保存。在Python语言中,可通过函数cv.VideoCapture和cv.VideoWrite实现类的初始化。
函数原型
cv.VideoCapture( index[, apiPreference] ) → <VideoCapture object>
cv.VideoCapture(filename[, apiPreference]) → <VideoCapture object>
cv.VideoWriter([filename, fourcc, fps, frameSize[, isColor]]) → <VideoWriter object>
参数说明
- index:摄像头的ID编号,index=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():关闭视频写入,释放对象。
注意问题
(1) 在读取视频文件或视频流时,可通过filename指定视频文件或视频流的路径。在使用摄像头时,可通过index定义摄像头的ID编号。
(2) 使用摄像头设备时,index=0表示默认从后端打开摄像头,如笔记本内置摄像头,支持计算机内置或外接的摄像头,也支持本地网络或公共网络的IP摄像头。
(3) 视频写入类VideoWriter的参数frameSize是元组(w,h),即视频帧的宽度和高度,而OpenCV图像的形状表示为(h,w),注意二者的顺序相反。
(4) 视频处理过程较为复杂,一些程序设置与具体系统环境有关,本节只介绍基本的成员函数和通用的处理方法。更多内容详见OpenCV说明文档(链接1-1)。
(5) 视频处理过程中的很多问题都会涉及计算机和摄像机的硬件设备及设置,需要结合具体系统和环境来分析。建议读者参考【例程0106】和【例程0107】,先确认视频读取和设备捕获环境的配置是否正确,再调试和运行其他的视频处理程序。
【例程0106】视频文件的读取、播放和保存
本例程能读取和播放视频文件,并可每隔若干帧抽取一帧,保存为新的视频文件。
读取视频文件的基本步骤如下。
(1) 创建视频,读取/捕获对象。
(2) 逐帧获取视频图像。
(3) 检查获取图像帧是否成功。
(4) 释放视频,读取/捕获对象。
保存视频文件的基本步骤如下。
(1) 设置写入视频的格式和参数。
(2) 创建视频写入对象。
(3) 逐帧写入图像。
(4) 释放视频写入对象。
# 【0106】视频文件的读取、播放和保存
import cv2 as cv
if __name__ == '__main__':
# 创建视频,读取/捕获对象
vedioRead = "../images/vedioDemo1.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/vedioSave1.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() # 关闭显示窗口
本书京东优惠购书链接:https://item.jd.com/14098452.html
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/132969247)
Copyright 2023 youcans, XUPT
Crated:2023-09-18
欢迎关注本书CSDN独家连载专栏
《数字图像处理-OpenCV/Python》连载: https://blog.csdn.net/youcans/category_12418787.html