opencv自定义间隔帧获取视频转存为图片的GUI界面实现

该程序功能只将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(target=run,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 = f"0000000{n}.jpg"img_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(parents=True, exist_ok=True)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="选择视频文件", command=select_video)
btn_select_video.pack(side='top',pady=10)# 添加选择输出路径按钮
btn_select_output = tk.Button(root, text="选择输出路径", command=select_output_dir)
btn_select_output.pack(side='top',pady=10)# 显示视频路径输入框
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(side='top', pady=10)
frame_interval_entry = tk.Entry(root)
frame_interval_entry.pack()# 添加开始处理按钮
btn_start = tk.Button(root, text="开始处理", command=start_process)
btn_start.pack(side='top',pady=10)# 添加停止处理按钮
btn_start = tk.Button(root, text="停止处理", command=stop_process)
btn_start.pack(side='top',pady=10)# 添加暂停处理按钮
btn_start = tk.Button(root, text="暂停处理", command=break_process)
btn_start.pack(side='top',pady=10)# 添加继续处理按钮
btn_start = tk.Button(root, text="继续处理", command=continue_process)
btn_start.pack(side='top',pady=10)# 启动主循环
root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/764234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PHP】通过PHP开启/暂停Apache、MySQL或其他服务

目录 一、前言 二、代码 一、前言 有些时候我们需要开启或暂停一些服务,比如说开启Apach或暂停MySQL服务等,最近工作中也开发了这方面的功能,记录下来怎样使用PHP语言来开启或暂停Apache、MySQL服务的运行状态。 这种方法也适用其他服务。…

laravel(源码笔记) 路由注册,加载,寻址,参数绑定过程

路由 Application __construct 注册路由到服务容器 setBasePathregisterBaseBindingsregisterBaseServiceProviders EventServiceProviderLogServiceProviderRoutingServiceProvider registerRouter registerCoreContainerAliases 加载路由文件 App\Providers\RouteServicePr…

深度学习中的随机种子random_seed

解释 由于模型中的参数初始化例如权重参数如下图,就是随机初始化的,为了能够更好的得到论文中提到效果,可以设置随机种子,从而减少算法结果的随机性,使其接近于原始结果。 设置了随机种子,产生的随机数都…

基于Java中的SSM框架实现考研指导平台系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现考研指导平台系统演示 摘要 应对考研的学生,为了更好的使校园考研有一个更好的环境好好的学习,建议一个好的校园网站,是非常有必要的。提供学生的学习提供一个交流的空间。帮助同学们在学习高数、学习设计、学习统计…

Docker搭建LNMP环境实战(一):前言

缘起:不久前学习了Docker相关知识,并在Docker环境下学习了LNMP环境的搭建。由于网上的文章大多没有翔实、可行的案例,很多文章都是断章取义,所以,期间踩了太多太多的坑,初学者想要真正顺利地搭建一套环境起…

数值代数中的灵敏度分析【条件数】

文章目录 一、条件数二、解线性方程组问题的条件数 在数值分析领域,灵敏度分析是一种用来评估数值模型对输入参数变化的敏感程度的技术。它在许多科学和工程领域中都有广泛的应用,包括金融、工程设计、自然资源管理等。 一、条件数 一个实际问题化为数…

基于python+vue的ITS 信息平台的设计与实现flask-django-nodejs-php

伴随着我国社会的发展,人民生活质量日益提高。于是对系统进行规范而严格是十分有必要的,所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套信息平台,帮助交通局进行信息共享、交通信…

Android设计模式

在Android应用开发中,设计模式是非常重要的一部分,它们提供了一种标准化的方式来解决常见的软件设计问题,提高代码的可读性、可维护性和复用性。以下是一些在Android开发中常见和实用的设计模式分类: ### 创建型模式(…

【Spring框架】单元测试:JUnit

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

使用 Pytorch 和 Rasterio 的自定义地理空间数据加载器

地理空间数据在从遥感和城市规划到环境监测和灾害管理的各个领域发挥着至关重要的作用。在处理机器学习任务的地理空间数据时,准备自定义数据加载器对于有效加载、预处理和增强数据而不丢失其属性至关重要,特别是当输入图像具有超过 3 个波段时。 Rasterio确实是一个专门为有…

2核2G服务器阿里云多少钱一年?

阿里云2核2G服务器配置优惠价格61元一年和99元一年,61元是轻量应用服务器2核2G3M带宽、50G高效云盘;99元服务器是ECS云服务器经济型e实例ecs.e-c1m1.large,2核2G、3M固定带宽、40G ESSD entry系统盘,阿里云活动链接 aliyunfuwuqi.…

Gavin Wood 精彩演讲|安全灵活 JAM 链,打造去中心化多核计算机

Polkadot 年度开发者大会 sub0 Asia 近期在泰国曼谷正式落幕。面对区块链行业的激烈竞争,Polkadot 创始人 Gavin Wood 在演讲中说明将如何利用 Polkadot 2.0 与 JAM 链带来新的技术创新,推动生态持续发展。 Polkadot 将推一个名为 JAM 链的新网络。JAM …

单机模拟分布式MINIO(阿里云)

拉取的最新MINIO: minio version RELEASE.2024-03-15T01-07-19Z Runtime: go1.21.8 linux/amd64 分布式 MinIO 至少需要4个节点,也就意味着至少4个硬盘,对于囊中羞涩仅用来开发测试的人来说,这笔花销还是比较高昂。有没有更好的…

Day61:WEB攻防-PHP反序列化原生类TIPSCVE绕过漏洞属性类型特征

知识点: 1、PHP-反序列化-属性类型&显示特征 2、PHP-反序列化-CVE绕过&字符串逃逸 3、PHP-反序列化-原生类生成&利用&配合 补充:如果在 PHP 类中没有实现某个魔术方法,那么该魔术方法在相应的情况下不会被自动触发。PHP 的魔…

Oracle 11G备份集中控制文件和spfile被异常删除

坐标大理,苍山下,洱海旁,风花雪月!! 今日一大早就接到一个case,根据客户描述,大概意思是昨天晚上发现18号的ctl和spfile无故消失,备份策略是一周一个0级增量备份,每日进…

Promise和事件轮询

Promise和事件轮询 今日目标: 1.Promise 要求:能够清楚的说出Promise的特性和静态方法 2.事件轮询 要求:能够理解清楚同步和异步在底层的实现机制 00-回顾 # ajax概述 async javascript and xml: 异步的js和xml作用: 实现客…

python数据容器--集合

什么是集合 列表可以修改,支持重复元素且有序 元组、字符串不可修改,支持重复元素且有序 集合无序,不可重复 定义一个集合 #去重,且无序 #集合无序因此不支持下标访问 #但集合和列表一样,是允许修改的 my_set{&quo…

机器学习——线性回归(头歌实训)

头歌机器学习实训代码、答案,如果能够帮到您,希望可以点个赞!!! 如果有问题可以csdn私聊或评论!!!感谢您的支持 目录 第1关:简单线性回归与多元线性回归 第2关&#…

JVM加类加载器

文章目录 JVM内存模型内存分配策略JVM内存分配策略优化的最佳实践对象头类加载类加载器有哪几种?如何实现一个自定义类加载器?类加载机制如何影响性能调优? JVM内存模型 JVM(Java虚拟机)内存模型描述了Java虚拟机在执…

矩阵理论的概念间的组合关系的公式

矩阵理论的概念间的组合关系的公式 现在很火执的人工智能技术,要求很高的数学基础知识。 除了微积分就是线性代数的内容了。自动微分框架是人工 智能技术的底层框架。其实就是实现了微积分的各种函数 的微积分运算而矣。线性代数的内容应用于计算机 的软件中的各个…