调用函数cv.VideoCapture()创建一个VideoCapture对象,就可以读取视频文件、网络视频流的每一帧图像,但没有声音。输入参数filename为字符串,用于指定读取的视频文件名(可包含文件存放的目录路径)、或网络视频流的URL地址。
通过获取视频文件的帧率fps = cap.get(cv.CAP_PROP_FPS)来设置cv.waitKey()的等待时间,以便按正常帧率播放。如果等待时间设置的太短,视频就会播放的非常快;如果等待时间设置的太长,播放就会很慢(你可以使用这种方法控制视频的播放速度)。
调用函数cv.VideoWriter()创建一个VideoWriter对象,就可以把处理后的每一帧图像保存到视频文件中。
#OpenCV视频文件的读写
#导入用到的包
import numpy as np
import cv2 as cv
#创建VideoCapture对象读取视频文件
cap = cv.VideoCapture('./imagedata/atrium.mp4')
#调用VideoCapture对象的成员函数isOpened(),查看文件打开状态
#返回True正常继续,False失败退出
if not cap.isOpened():
print("Cannot open the file")
exit()
#调用VideoCapture对象的成员函数get(),获取视频的帧率、帧宽和高
fps = cap.get(cv.CAP_PROP_FPS)
frame_width = cap.get(cv.CAP_PROP_FRAME_WIDTH)
frame_height = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
#指定保存视频文件的编码器
fourcc = cv.VideoWriter_fourcc(*'XVID')
#创建视频文件保存VideoWriter对象
out_gray = cv.VideoWriter('video_gray.avi', fourcc, int(fps), \
(int(frame_width), int(frame_height)), isColor=False)
#读取视频图像帧直至按Esc键退出或播放到最后一帧
while cap.isOpened():
#采集视频图像帧
ret, frame = cap.read()
#如果正确读取视频图像帧,返回值ret为True,否则为False则退出程序
if not ret:
print('Cannot receive frame, or end of file playback, Exiting ...')
break
#以下代码处理视频图像帧,将每帧图像转换为灰度图像
gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
#调用VideoWriter对象成员函数将转换后的图像帧保存到视频文件中
out_gray.write(gray_frame)
#显示图像
cv.imshow('Video color frame', frame)
cv.imshow('Video gray frame', gray_frame)
#根据视频文件帧率播放图像,按Esc键退出
if cv.waitKey(int(1000/fps)) & 0xFF == 27:
break
cap.release() #退出视频播放并释放VideoCapture对象
out_gray.release() #释放VideoWriter对象
cv.destroyAllWindows() #关闭图像显示窗口并释放资源
#---------------------------------------------------