最近做项目需要将AVI格式的视频,一帧一帧保存成PNG格式的图片,在CSDN上搜索之后进行了汇总。
由于项目的特殊性,一个文件夹中包含很多视频文件,要求将每个视频文件抽帧之后的图片保存在单独的文件夹中,就要求将不断创建新的文件夹,具体如下:
1.首先是读取视频文件的路径:
video_path = "E:/***/" # 设置为视频文件存储的路径即可
img_path = 'E:/***/' # 设置为图片文件存储路径
if not os.path.exists(img_path): # 如果存储图片的文件夹不存在,自动创建保存图片文件夹
os.makedirs(img_path)
filename = os.listdir(video_path) # 得到视频文件的文件名
for save_name in filename:
# print(save_name.split('.')[0])
name1 = save_name.split('.')[0] # 得到无后缀的文件名
if not os.path.exists(img_path + name1): # 如果存储图片的文件夹不存在,自动创建保存图片文件夹
os.makedirs(img_path + name1) # 创建以视频文件名为名称的文件夹
2. 进行帧数选择、视频文件读取和图片保存
n = 0
start_name = '0000000.png'
timeF = 1 # 帧数选择
name = video_path + save_name # 视频文件路径
cv = cv2.VideoCapture(name) # 读入视频文件,命名cv
if cv.isOpened(): # 判断是否正常打开
rval, frame = cv.read()
i = 1
else:
rval = False
print('open video error!!')
while rval: # 正常打开 开始处理
rval, image = cv.read()
jpg_name =img_path + name1 + '/' + str(int(start_name[0:-4]) + n).zfill(6) + '.png' # 命名保存的图片
if (i % timeF == 0): # 每隔timeF帧进行存储操作
n += 1
try:
img = Image.fromarray(image)
img.save(jpg_name)
#cv2.imwrite(jpg_name, image) # 存储为图像
except:
pass
print(jpg_name)
i += 1
cv2.waitKey(1)
cv.release()
print(name + ' done')
最后,整体代码如下所示:
import cv2
import os
from PIL import Image
if __name__ == "__main__":
video_path = "E:/项目/Data/MV-CB060-10GC-S (L27457211)/" # 设置为视频文件存储的路径即可
img_path = 'E:/项目/img/'
if not os.path.exists(img_path): # 如果存储图片的文件夹不存在,自动创建保存图片文件夹
os.makedirs(img_path)
filename = os.listdir(video_path)
for save_name in filename:
print(save_name.split('.')[0])
name1 = save_name.split('.')[0]
if not os.path.exists(img_path + name1): # 如果存储图片的文件夹不存在,自动创建保存图片文件夹
os.makedirs(img_path + name1)
n = 0
start_name = '0000000.png'
timeF = 5 # 帧数选择
name = video_path + save_name
cv = cv2.VideoCapture(name) # 读入视频文件,命名cv
if cv.isOpened(): # 判断是否正常打开
rval, frame = cv.read()
i = 1
else:
rval = False
print('open video error!!')
while rval: # 正常打开 开始处理
rval, image = cv.read()
jpg_name =img_path + name1 + '/' + str(int(start_name[0:-4]) + n).zfill(6) + '.png' # 命名保存的图片
if (i % timeF == 0): # 每隔timeF帧进行存储操作
n += 1
try:
img = Image.fromarray(image)
img.save(jpg_name)
#cv2.imwrite(jpg_name, image) # 存储为图像
except:
pass
print(jpg_name)
i += 1
cv2.waitKey(1)
cv.release()
print(name + ' done')
print('cut video done')