使用Python编写的图形用户界面(GUI)应用程序,用于从一个文件夹中提取视频文件,并将每个视频中的每一秒抽取一帧图片。
1:导入必要的库:
os:用于处理文件和目录。
cv2:OpenCV库,用于处理视频和图像。
tkinter:Python的标准GUI库,用于创建和管理图形界面。
**2:定义了一个名为extract_frames_every_second的函数,该函数执行以下操作:
遍历指定文件夹中的所有.mp4视频文件。
设置进度条的最大值为视频文件的数量。
对于每个视频文件:
使用OpenCV打开视频文件。
获取视频的帧率(fps)并计算跳过的帧数。
逐帧读取视频,并在每一秒时保存一帧图像。
创建保存帧的文件夹,并使用cv2.imwrite函数将帧保存为JPEG格式。
更新日志文本框和进度条。
释放视频文件资源。
import os
import cv2
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
from tkinter import ttk
def extract_frames_every_second(folder_path):
video_files = [f for f in os.listdir(folder_path) if f.endswith('.mp4')]
total_videos = len(video_files)
progress_bar['maximum'] = total_videos
log_text.insert(tk.END, f"开始处理 {total_videos} 个视频文件...\n")
log_text.see(tk.END)
root.update_idletasks()
for index, video in enumerate(video_files, start=1):
video_path = os.path.join(folder_path, video)
capture = cv2.VideoCapture(video_path)
fps = capture.get(cv2.CAP_PROP_FPS)
frame_skip_count = max(1, round(fps))
success, image = capture.read()
count = 0
timestamp = 0
while success:
timestamp += 1 / fps
if timestamp >= 1:
timestamp -= 1
frame_folder = os.path.join(folder_path, video.split('.')[0])
os.makedirs(frame_folder, exist_ok=True)
frame_path = os.path.join(frame_folder, f"frame_{int(count / frame_skip_count)}.jpg")
cv2.imwrite(frame_path.encode('utf-8').decode('gbk'), image)
success, image = capture.read()
count += 1
capture.release()
log_text.insert(tk.END, f"视频文件 {index}/{total_videos} 处理完成: {video}\n")
log_text.see(tk.END)
root.update_idletasks()
progress_bar['value'] = index
定义了一个名为browse_folder的函数,用于打开文件夹选择对话框,并允许用户选择一个文件夹路径。选定的路径将显示在输入框中。
创建GUI窗口,并设置窗口标题和大小。
添加标题标签,显示应用程序的名称。
创建一个文件夹路径输入框和浏览按钮,用户可以通过这个输入框输入或选择一个文件夹路径。
添加一个执行按钮,当点击时,会调用extract_frames_every_second函数并传递用户选择的文件夹路径。
创建进度条,用于显示处理进度。
添加日志文本框和滚动条,用于显示执行过程中的日志信息。
最后,启动GUI应用程序的主循环,等待用户操作。

本文介绍了一个使用Python编写的GUI应用程序,通过OpenCV处理视频,从用户选择的文件夹中每秒抽取MP4视频的单帧,并保存为JPEG。程序包括文件夹选择、进度跟踪和日志输出功能。
3245

被折叠的 条评论
为什么被折叠?



