zoukankan      html  css  js  c++  java
  • python实现视频分帧

    1、要求

    需要对指定文件夹(注意路径中不可包含中文,负责分帧失效)下的视频进行逐个分帧,并且指定时间间隔,保存帧的大小格式。
    需要讲脚本存放在视频文件夹的同级目录。如图所示

    2、代码

    
    import os
    import cv2
    
    
    # 文件路径绝对不可以含有中文,否则运行失效
    
    
    def filter_video(video, all_formats):
        """
        查看video_name视频是否符合格式
        :param video: 视频文件名
        :param all_formats: 允许格式列表
        :return: Bool
        """
    
        if video[-4:] in all_formats:
            return True
        else:
            return False
    
    
    def video_framing(video_dir, time_interval, all_formats, frame_height, frame_width):
        """
        将video_dir目录下的视频逐个分帧保存到对应的文件夹下
        :param video_dir: 视频目录
        :param frame_height: 帧高
        :param frame_ 帧宽
        :param time_interval: 时间间隔
        :param all_formats: 支持的视频格式列表
        :return:
        """
    
        recent_path = os.getcwd()
        videos_path = os.path.join(recent_path, video_dir)  # 视频存放路径
    
        frame_dir_path = os.path.join(recent_path, "new_"+video_dir)
        if not os.path.exists(frame_dir_path):
            os.mkdir(frame_dir_path)  # 生成新目录保存保存帧,默认目录名new_video_dir
        videos_list = os.listdir(videos_path)  # 视频文件名列表
    
        # 查看视频是否符合格式,否则剔除
        for video in videos_list:
            if not filter_video(video, all_formats):
                videos_list.remove(video)
    
        # 开始处理
        for video in videos_list:
            print("processing", video)
    
            video_name = video[:-4]
            os.mkdir(os.path.join(frame_dir_path, video_name))  # 为每一个视频创建一个存放帧的目录
    
            each_video_frame_save_path = os.path.join(frame_dir_path, video_name) + "\"  # 每一个视频帧预存放路径
            each_video_path = os.path.join(videos_path, video)  # 每一个视频目前的存放路径
    
            cap = cv2.VideoCapture(each_video_path)
            frame_index, frame_count = 0, 0
    
            # 视频是否加载成功
            if cap.isOpened():
                open_success = True
            else:
                open_success = False
                print("视频加载失败")
    
            try:
                # 读取视频帧并写入
                while open_success:
                    read_success, frame = cap.read()
                    print("------>正在读取第%d帧" % frame_index, read_success)
    
    
                    if frame_index % time_interval == 0:
                        # resize_frame = cv2.resize(frame, (frame_width, frame_height), interpolation=cv2.INTER_AREA)  # 定义帧的格式
                        frame_name = "%d.jpg" % frame_count
                        each_video_frame_path_name = os.path.join(each_video_frame_save_path, frame_name)  # 每一帧保存路径与帧命名
                        cv2.imwrite(each_video_frame_path_name, frame)
                        print("------>写入第%d帧" % frame_count)
                        frame_count += 1
    
                    frame_index += 1
            except cv2.error:  # 异常处理,每个视频处理结束后会出异常
                print(video_name, "处理完成")
    
            cap.release()
    
    
    if __name__ == "__main__":
        # 帧参数
        frame_height, frame_width = 320, 240
        time_interval = 1000
    
        all_formats = [".MOV", ".mp4", ".MP4"]  # 视频支持格式
    
        video_framing("B3", 50, all_formats, frame_height, frame_width)
    
    

    3、结果

    生成新目录,帧保存在新目录

  • 相关阅读:
    【luogu P7112】【模板】行列式求值(数学)(线性代数)(高斯消元)
    【luogu P3506】MOT-Monotonicity 2(线段树)
    【luogu AT5160】Numbers on a Circle(贪心)(堆)
    【luogu AT5159】RGB Balls(贪心)
    【luogu P5435】基于值域预处理的快速 GCD(数学)
    Day-20 基础模块1
    F5学习笔记
    Day-19 面向对象06 多继承 MRO C3算法 super()(重点)
    Day-18 面向对象05 约束、异常处理、日志处理
    MPLS(多协议卷标交换)
  • 原文地址:https://www.cnblogs.com/welan/p/13743305.html
Copyright © 2011-2022 走看看