前言
前一段时间写了一个简单的视频拆帧脚本,这次添加了一个将图片转为视频的组件,实现一个脚本内通用的视频拆帧(组帧)。
一、脚本运行依赖
OpenCV-Python >= 4.5.5
二、参数解释与必需参数
1.视频拆帧
定义视频拆帧的函数video_to_image()中各参数含义如下:
video_path: ROOT -> 视频路径(或视频所在文件目录)
step: int=None -> 间隔帧率,默认不间隔取帧
fps: int=25 -> 视频帧率,默认25帧
start: str=None -> 开始时间(00:00:00),默认视频开始时间
end: str=None -> 结束时间(00:00:00),默认视频结束时间
use_file_name: bool=False -> 是否使用视频文件名作为命名规范
img_format: str=‘jpg’ -> 保存的图片格式
save_path: ROOT=‘./images’ -> 保存的文件路径
调用时,必需传入video_path参数,该参数可以是某一个视频文件,也可以是包含一些视频的文件夹。
2.视频组帧
定义的视频组帧方法Video()中各参数含义如下:
images: ROOT -> 图片所在目录
video_name: str=None -> 保存的视频名
video_format: str=‘mp4’ -> 保存的视频格式
image_format: str=‘jpg’ -> 选取的图片格式
size: list=None -> 合并图片的resize大小
fps: int=25 -> 合成视频的帧率
output: ROOT=‘./output’ -> 视频输出目录
实例化该方法后,通过调用该方法中的make_video()方法,实现图片到视频的转化。
与拆帧函数一样,实例化时必需传入的参数为images,该参数表示图片所在目录。
三、源代码
'''
Descripttion:
version: 1.0
Author: UniFind
Date: 2022-07-30 11:24:17
LastEditors: UniDome
LastEditTime: 2022-07-30 16:33:12
'''
__author__ = 'UniDome'
__version__ = '1.0.1'
import cv2
import os, sys
from pathlib import Path
import glob
from tqdm import tqdm
FILE = Path(__file__).resolve() # 当前文件所在绝对路径
ROOT = FILE.parents[0]
if str(ROOT) not in sys.path:
sys.path.append(str(ROOT))
ROOT = Path(os.path.relpath(ROOT, Path.cwd())) # 当前文件所在相对路径
IMG_FORMATS = ['bmp', 'jpg', 'jpeg', 'png', 'tif', 'tiff', 'dng', 'webp', 'mpo']
VID_FORMATS = ['mov', 'avi', 'mp4', 'mpg', 'mpeg', 'm4v', 'wmv', 'mkv']
VID_MKFORMATS = ['avi', 'mp4']
VID = ['.' + x for x in VID_FORMATS]
class Frame(object):
'''
该方法重新定义了一个迭代器,视频地址、图片、该图片的内部编号、图片命名
'''
def __init__(
self,
video_path:ROOT,
step:int=None,
fps:int=25,
start:int=None,
end:int=None,
use_file_name:bool=False,
img_format:str='jpg'
) -> None:
# 参数含义同video_to_image()
self.step = step if step is not None else 1
self.fps = fps
self.start = start
self.end = end
self.use_file_name = use_file_name
self.img_format = img_format
p = str(Path(video_path).resolve())
if os.path.isdir(p):
dir_file = os.listdir(video_path)
files_v = [pa for pa in dir_file if os.path.splitext(pa)[-1] in VID]
files = [os.path.join(p, file) for file in files_v]
elif os.path.isfile(p):
assert os.path.splitext(p)[-1] in [ x for x in VID], f'Supported formats are:\nimages: {
VID_FORMATS}'
files = [p]
else:
raise Exception(f'ERROR: {
p} does not exist')
self.nv = len(files)
self.count = 0
self.videos = files
self.pps = 0 # 当前帧所处位号
self.frame = 0
assert self.nv > 0, f'No images or videos found in