利用OpenCV-Python实现视频拆帧(组帧),也可以用于组合实现视频格式的转换


前言

前一段时间写了一个简单的视频拆帧脚本,这次添加了一个将图片转为视频的组件,实现一个脚本内通用的视频拆帧(组帧)。


一、脚本运行依赖

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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值