【 用python写一个把视频每一帧提取为png图片】

embedded/2024/10/21 20:26:47/

pythonpng_0">用python写一个把视频每一帧提取为png图片

在运行此代码之前,请确保您已经安装了OpenCV库。如果没有安装,可以使用以下命令进行安装:

pip install opencv-python

下面是提取视频帧的Python脚本:

python">import cv2
# 视频文件路径
video_path = 'input_video.mp4'
# 读取视频文件
cap = cv2.VideoCapture(video_path)
# 获取视频的帧率
fps = int(cap.get(cv2.CAP_PROP_FPS))
# 获取视频的总帧数
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
# 初始化帧计数器
frame_count_init = 0
# 检查是否成功打开视频文件
if not cap.isOpened():print(f"无法打开视频文件: {video_path}")
else:while True:# 逐帧读取视频ret, frame = cap.read()# 如果读取帧失败,则退出循环if not ret:print("视频读取完毕或发生错误")break# 构建输出图片的文件名frame_filename = f'frame_{frame_count_init:04d}.png'# 保存帧为PNG图片cv2.imwrite(frame_filename, frame)print(f"已保存: {frame_filename}")# 更新帧计数器frame_count_init += 1
# 释放视频捕获对象
cap.release()

以下是对这段程序的介绍:

一、程序功能

该程序的主要功能是将指定的视频文件逐帧拆分为单独的 PNG 图片进行保存。

二、程序实现步骤

  1. 首先指定了要处理的视频文件路径 video_path = 'input_video.mp4'
  2. 接着使用 cv2.VideoCapture() 函数读取视频文件,并将其存储在 cap 对象中。
    • 通过 cap.get(cv2.CAP_PROP_FPS) 获取视频的帧率,存储在 fps 变量中。
    • 通过 cap.get(cv2.CAP_PROP_FRAME_COUNT) 获取视频的总帧数,存储在 frame_count 变量中。
    • 初始化帧计数器 frame_count_init 为 0。
  3. 然后检查视频文件是否成功打开,如果没有成功打开,则输出错误信息。如果成功打开,则进入循环处理每一帧。
    • 在循环中,使用 cap.read() 逐帧读取视频,返回值 ret 表示是否成功读取一帧,frame 表示读取到的帧图像。
    • 如果读取帧失败,说明视频读取完毕或发生错误,退出循环。
    • 构建输出图片的文件名,格式为 frame_{帧计数器:04d}.png,确保文件名以四位数的帧序号命名,不足四位前面补零。
    • 使用 cv2.imwrite() 函数将当前帧保存为 PNG 图片。
    • 最后更新帧计数器。
  4. 程序最后使用 cap.release() 释放视频捕获对象,以释放资源。

你会发现这个程序无法实现用户自定义选择视频路径,还有输出的时候直接输出到当前目录,可能会导致文件夹很乱,所以需要优化一下:

  • 添加图形化选择视频路径功能,使用tk库
  • 修改图片输出目录,在当前文件夹创建一个名为output的目录,图片输出到该目录下
    为了添加图形化选择视频文件的功能,我们可以使用tkinter库来创建一个简单的图形用户界面(GUI)。以下是修改后的代码,它允许用户通过文件对话框选择视频文件,并将提取的帧保存到名为output的文件夹中。
    请确保您已经安装了opencv-pythontkinter(通常它是Python标准库的一部分,不需要单独安装)。

下面是提取视频帧的Python脚本:

python">import cv2
import os
from tkinter import filedialog, Tk
# 创建一个Tkinter根窗口并隐藏
root = Tk()
root.withdraw()
# 使用文件对话框选择视频文件
video_path = filedialog.askopenfilename(title="选择视频文件", filetypes=[("视频文件", "*.mp4;*.avi;*.mov")])
# 检查是否选择了文件
if video_path:# 创建output文件夹,如果不存在的话output_folder = 'output'if not os.path.exists(output_folder):os.makedirs(output_folder)# 读取视频文件cap = cv2.VideoCapture(video_path)# 获取视频的帧率fps = int(cap.get(cv2.CAP_PROP_FPS))# 获取视频的总帧数frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))# 初始化帧计数器frame_count_init = 0# 检查是否成功打开视频文件if not cap.isOpened():print(f"无法打开视频文件: {video_path}")else:while True:# 逐帧读取视频ret, frame = cap.read()# 如果读取帧失败,则退出循环if not ret:print("视频读取完毕或发生错误")break# 构建输出图片的文件名frame_filename = f'frame_{frame_count_init:04d}.png'# 完整的输出路径output_path = os.path.join(output_folder, frame_filename)# 保存帧为PNG图片cv2.imwrite(output_path, frame)print(f"已保存: {output_path}")# 更新帧计数器frame_count_init += 1# 释放视频捕获对象cap.release()
else:print("没有选择视频文件")

程序实现步骤

  1. 用户选择视频文件

    • 创建一个隐藏的 Tkinter 根窗口。
    • 使用 filedialog.askopenfilename 函数弹出文件对话框,让用户选择视频文件。支持的视频文件类型包括 .mp4.avi.mov
    • 如果用户选择了文件,视频文件的路径将存储在 video_path 变量中;如果用户未选择文件,则输出提示信息并结束程序。
  2. 处理视频文件

    • 如果选择了视频文件,首先检查是否存在名为“output”的文件夹,如果不存在则创建该文件夹,用于保存输出的图片。
    • 使用 cv2.VideoCapture() 读取视频文件,并存储在 cap 对象中。
    • 像之前的程序一样,获取视频的帧率和总帧数,并初始化帧计数器。
    • 检查视频文件是否成功打开,如果未成功打开则输出错误信息。
    • 在循环中逐帧读取视频,对于每一帧:
      • 构建输出图片的文件名,格式为 frame_{帧计数器:04d}.png
      • 确定完整的输出路径,即“output”文件夹加上文件名。
      • 使用 cv2.imwrite() 将当前帧保存为 PNG 图片到指定路径。
      • 更新帧计数器。
    • 循环结束后,释放视频捕获对象以释放资源。

http://www.ppmy.cn/embedded/129352.html

相关文章

《OpenCV计算机视觉》—— 风格迁移

将下图中的图片换一种风格展示出来 如下图结果: 完整代码如下: import cv2image_yuantu cv2.imread("wechat.jpg") image cv2.resize(image_yuantu, dsizeNone, fx0.5, fy0.5) cv2.imshow(yuan tu, image) cv2.waitKey(0)""&q…

UE(其他)

工具界面 Content browser资产管理器针对所有,Outliner仅针对当前map的scene资源 保存新的Map,将当前另存为 Content browser中import导入资源 Setting 鼠标中间Preference(偏好)-》level Editor-》viewport-》mouse Pan 默…

Mysql环境安装

1,下载压缩包 下载压缩包解压 2,配置环境变量 i,高级系统设置-->环境变量-->系统变量-->path-->添加mysql的bin目录路径 ii,新建my.ini文件 basedir:MYSQL的路径 datadir:这个data路径不用手动创建&am…

二十三节补充

考虑如何在不添加公共端demo的情况下同时保存两个视频 更改公共端demo public: void video1_demo(Mat& image); struct TwoImages { Mat img1; Mat img2; }; TwoImages colorSpace_Demo(Mat& image); 将刚刚修改的demo运用到调用的需…

nginx中的HTTP 负载均衡

HTTP 负载均衡:如何实现多台服务器的高效分发 为了让流量均匀分配到两台或多台 HTTP 服务器上,我们可以通过 NGINX 的 upstream 代码块实现负载均衡。 方法 在 NGINX 的 HTTP 模块内使用 upstream 代码块对 HTTP 服务器实施负载均衡: upstr…

项目管理PMP入门,2024新手没工具怎么成大神?

(三)PMP 的价值 PMP 证书的价值在多个方面得以体现。在就业方面,许多大型企业将 PMP 证书作为招聘项目管理相关人才的优先考虑条件,甚至有些企业要求公司高层必须考取该证书,成为进入这些企业的 “敲门砖”。同时&…

Python基础语法-列表与元组

列表与元组 在编程中,经常需要使用变量来保存数据,如果数据比较少,我们创建几个变量也就算了,那如果数据很多呢。 甚至有些时候数据多到你都不清楚到底有多少,那么就需要使用到列表了。 列表是一种让程序员再代码中批…

【H2O2|全栈】更多关于HTML(2)HTML5新增内容

目录 HTML5新特性 前言 准备工作 语义化标签 概念 新内容 案例 多媒体标签 音频标签audio 视频标签 video 新增部分input表单属性 预告和回顾 后话 HTML5新特性 前言 本系列博客是对入门专栏的HTML知识的补充,并伴随一些补充案例。 这一期主要介绍H…