已经有很多文章描述了如何将视频拆分成视频帧,例如:https://blog.csdn.net/WYKB_Mr_Q/article/details/124929081
这里我们主要用到了 OpenCV 库中的 VideoWriter 类。
OpenCV种的 cv2.VideoWriter 类可以将图片序列保存成视频文件,也可以修改视频的各种属性,还可以完成对视频类型的转换。该类种常用的函数包括:构造函数、write 函数等。
1、构造函数
OpenCV中的cv2.Video_fourcc()
用来指定视频编码格式:
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # MP4格式
上述代码指定视频写入器的格式为 .mp4 格式。需要注意到’mp4v’中的英文字母,要么全大写,要么全小写。
保存为其它视频参考格式如下:
支持avi格式:
I420,YUV编码,视频格式为.avi
PIM1,MPEG-1编码,视频格式为.avi
XVID,MPEG-4编码,视频格式为.avi
其他编码器
THEO,Ogg Vorbis,视频格式为.ogv
FLV1,Flash视频,视频格式为.flv
AVC1,H264编码
DIV3,MPEG-4.3编码
DIVX,MPEG-4编码
MP42,MPEG-4.2编码
MJPG,motion-jpeg编码
U263,H263编码
I263,H263I编码
设置完视频写入格式之后,需要完成对象创建,比如设置视频的帧率,视频帧的长和宽等参数。这里我们主要用到了cv2.VideoWriter()
函数。
videowrite = cv2.VideoWriter(save_video_path, fourcc, fps=15, frameSize=(w, h))
其中,save_video_path参数表示合成之后视频保存的路径及名称;fourcc表示上述编码格式;fps就是帧率,即每秒播放多少张图片;frameSize表示保存视频的宽和高。
2、write函数
cv2.VideoWriter.write()
用于写入下一帧视频。
videowrite.write(img)
其中,img表示读取到的视频帧数据。
3、释放
释放该类对象时所使用的是函数cv2.VideoWriter.release()
。该函数的语法格式是:
videowrite.release()
在制作视频时,不用这个也没关系。
下面是完整的代码:
import cv2
import os
# 视频帧放置的文件夹路径,假如有多组视频帧,在frames文件夹下可放置多个文件夹
frame_path = r"E:\data\frames"
# 生成视频存放的文件夹路径
video_path = r"E:\datas\videos"
for root, dirs, files in os.walk(frame_path):
# 一个文件夹中的第几个视频帧
i = 0
for file in files:
# 读取图像的地址
img_path = os.path.join(root, file)
img = cv2.imread(img_path)
h, w, c = img.shape
i += 1
# 如果是第一个视频帧,则构造视频对象
if i == 1:
# 保存视频的地址
dir_lis = root.split("\\")
save_videos_path = os.path.join(video_path, dir_lis[-3], dir_lis[-2])
# 如果路径不存在,则创建文件夹
if not os.path.exists(save_videos_path):
os.makedirs(save_videos_path)
# 加入文件名
save_video_path = os.path.join(save_videos_path, dir_lis[-1] + '.mp4')
# 设置视频写入器
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # MP4格式
# 完成写入对象的创建,第一个参数是合成之后的视频的名称,第二个参数是可以使用的编码器,第三个参数是帧率即每秒钟展示多少张图片,第四个参数是图片大小信息
videowrite = cv2.VideoWriter(save_video_path, fourcc, fps=15, frameSize=(w, h)) # 2是每秒的帧数,size是图片尺寸
# 将视频帧写入视频对象中
videowrite.write(img)
print("第{}张图像合成成功".format(i))
print('------done!!!------')
参考链接:https://zhuanlan.zhihu.com/p/399689868
日常学习记录,一起交流讨论吧!侵权联系~