企业网站制作模板免费,网站开发公司制作平台,亚马逊雨林,中国城乡建设部人力网站首页该程序功能只将mp4转为jpg
希望得到您的指导
非常感谢您观看我的博客#xff0c;我的博客是为了记录我的学习过程同时保留我的某些可重复利用代码以方便下次使用。如果您对我的博客有任何建议还请您不吝指出#xff0c;非常感谢您对我的指导。
背景
在实现opencv逐帧获取…该程序功能只将mp4转为jpg
希望得到您的指导
非常感谢您观看我的博客我的博客是为了记录我的学习过程同时保留我的某些可重复利用代码以方便下次使用。如果您对我的博客有任何建议还请您不吝指出非常感谢您对我的指导。
背景
在实现opencv逐帧获取视频转存为图片后我便有了编写程序以图形的形式显示操作页面的想法。本文是基于上篇文章代码的修改以实现简单的GUI图形界面。
实现过程中发现仍需要深化学习的技术 线程与进程 tkinter pathlib 打包为exe 发布到局域网
下图为运行结果实例 import tkinter as tk
from tkinter import filedialog
import cv2
from pathlib import Path
import threadingglobal is_processing,current_task,pool,pause_event
pause_event threading.Event()
pause_event.set()
is_processing True
pool Nonedef select_video():video_path filedialog.askdirectory()entry_video.delete(0, tk.END)entry_video.insert(0, video_path)def select_output_dir():output_dir filedialog.askdirectory()entry_output.delete(0, tk.END)entry_output.insert(0, output_dir)def start_process():global is_processingis_processing Trueapp_status()def stop_process():global is_processing,poolis_processing Falsedef break_process():global is_processing,pause_event# is_processing Falsepause_event.clear()def continue_process():global is_processing,thread,pause_event# is_processing Truepause_event.set()def app_status():global is_processing,threadvideo_path entry_video.get()output_dir entry_output.get()interval int(frame_interval_entry.get())thread threading.Thread(targetrun,args(video_path,output_dir,interval))thread.start()def output_img(video_path, img_dir,frame_interval):global is_processing,pause_event# 由视频逐帧输出图片# video_path: 视频文件路径# img_dir: 图片保存目录路径路径不支持中文cv cv2.VideoCapture(video_path)frame_count 0n 0while is_processing:ret, frame cv.read()if not ret:breakframe_count 1if frame_count % frame_interval 0:if not pause_event.is_set(): # 检查是否需要暂停线程pause_event.wait()n 1img_name f0000000{n}.jpgimg_file_path Path(img_dir) / img_nameif not img_file_path.exists():print(创建文件:, img_file_path)cv2.imwrite(str(img_file_path), frame, [cv2.IMWRITE_JPEG_QUALITY, 100])else:print(跳过:, img_file_path)def run(video_dir, img_dir,frame_interval):global is_processingwhile is_processing:if not is_processing:breakfor file in Path(video_dir).iterdir():if file.suffix .mp4:video_file_path str(file)img_dir_name Path(img_dir) / file.stem # 使用视频文件名作为子目录名img_dir_name.mkdir(parentsTrue, exist_okTrue)output_img(video_file_path, str(img_dir_name),frame_interval)print(Thread execution stopped)# 创建主窗口
root tk.Tk()
root.title(视频处理程序)
root.geometry(800x600)# 添加选择视频按钮
btn_select_video tk.Button(root, text选择视频文件, commandselect_video)
btn_select_video.pack(sidetop,pady10)# 添加选择输出路径按钮
btn_select_output tk.Button(root, text选择输出路径, commandselect_output_dir)
btn_select_output.pack(sidetop,pady10)# 显示视频路径输入框
entry_video tk.Entry(root)
entry_video.pack()# 显示输出路径输入框
entry_output tk.Entry(root)
entry_output.pack()# 添加帧间隔输入框
frame_interval_label tk.Label(root, text帧间隔)
frame_interval_label.pack(sidetop, pady10)
frame_interval_entry tk.Entry(root)
frame_interval_entry.pack()# 添加开始处理按钮
btn_start tk.Button(root, text开始处理, commandstart_process)
btn_start.pack(sidetop,pady10)# 添加停止处理按钮
btn_start tk.Button(root, text停止处理, commandstop_process)
btn_start.pack(sidetop,pady10)# 添加暂停处理按钮
btn_start tk.Button(root, text暂停处理, commandbreak_process)
btn_start.pack(sidetop,pady10)# 添加继续处理按钮
btn_start tk.Button(root, text继续处理, commandcontinue_process)
btn_start.pack(sidetop,pady10)# 启动主循环
root.mainloop()