python实现提取视频帧的图片

news2025/1/4 19:14:32

文章目录

  • 1、需求痛点
  • 2、完整代码⭐
  • 3、代码分析
    • 3.1、需要改动的地方
    • 3.2、OpenCV库的使用
    • 3.3、多线程技术
  • 4、执行效率
  • 5、效果展示⭐
  • 6、注意事项🔺
  • 7、总结

🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎人工智能和前端开发。
🦅个人主页:@逐梦苍穹
📕所属专栏:项目
🌻您的一键三连,是我创作的最大动力🌹

1、需求痛点

有时候看见一个视频,想要截图里面的素材来自己用,但是此时又记不得自己需要的内容大概在视频的哪个地方,那么就得从头看视频不断暂停播放视频循环往复 ,以寻找需要的内容进行截图。
那么,本文就带你用 python 实现一个提取视频帧的程序把视频帧提取成图片
然后你只需要在键盘上利用 “->” 键,就可以轻松快速的找到想要的素材内容。
那么话不多说,进入正题!

2、完整代码⭐

# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2024/7/31 1:19

import cv2  # 导入OpenCV库,用于视频处理
import os  # 导入os库,用于文件和目录操作
import concurrent.futures  # 导入并发库,用于多线程处理
import time  # 导入时间库,用于计算时间


# 定义保存帧的函数
def save_frame(frame, frame_filename):
    cv2.imwrite(frame_filename, frame)  # 使用OpenCV保存帧到文件


# 定义提取视频帧的函数
def extract_frames(video_path, output_folder, frame_interval, max_threads):
    cap = cv2.VideoCapture(video_path)  # 打开视频文件
    frame_count = 0  # 初始化帧计数器
    futures = []  # 初始化futures列表,用于存储线程任务

    start_time = time.time()  # 记录开始时间

    # 使用ThreadPoolExecutor创建一个线程池,最大线程数为max_threads
    with concurrent.futures.ThreadPoolExecutor(max_workers=max_threads) as executor:
        while cap.isOpened():  # 当视频文件打开时
            ret, frame = cap.read()  # 读取一帧
            if not ret:  # 如果读取失败,跳出循环
                break

            if frame_count % frame_interval == 0:  # 每隔frame_interval帧处理一次
                seconds = frame_count // frame_interval  # 计算当前帧对应的秒数
                frame_filename = os.path.join(output_folder, f'frame_{seconds:04d}.jpg')  # 构建帧文件名
                futures.append(executor.submit(save_frame, frame, frame_filename))  # 提交保存帧的任务到线程池

            frame_count += 1  # 增加帧计数器

        cap.release()  # 释放视频文件

        for future in concurrent.futures.as_completed(futures):  # 等待所有线程完成
            future.result()  # 获取线程结果

    end_time = time.time()  # 记录结束时间
    elapsed_time = end_time - start_time  # 计算执行时间

    print(f'提取完成,共提取了 {frame_count // frame_interval} 帧')  # 输出提取的帧数
    print(f'程序执行时间: {elapsed_time:.2f} 秒')  # 输出程序执行时间


# 创建文件夹保存帧
output_folder = 'video_frames'
os.makedirs(output_folder, exist_ok=True)  # 如果文件夹不存在,则创建

# 打开视频文件
video_path = '1.mp4'

# 获取视频帧率
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)  # 获取视频的帧率
cap.release()  # 释放视频文件
frame_interval = int(1 * fps)  # 每秒提取一帧

# 用户指定的线程数
max_threads = 8

# 提取视频帧
extract_frames(video_path, output_folder, frame_interval, max_threads)  # 调用提取帧的函数

3、代码分析

3.1、需要改动的地方

首先,保存图片的文件夹名称,你可以修改:
在这里插入图片描述

然后,你需要把视频下载下来,填写视频路径:
在这里插入图片描述

接着,本程序是多线程的,你需要指定你所需要的线程数量:
在这里插入图片描述

最后,该程序默认是一秒提取一帧图片,你可以修改这个数字:
在这里插入图片描述

1 * fps"即每秒提取一帧图片,同理,如果想要十秒提取一张,则是"10 * fps”。

3.2、OpenCV库的使用

OpenCV是一个强大的计算机视觉库,支持视频和图像处理。
在本程序中,OpenCV被用来读取视频文件和保存帧图像。
cv2.VideoCapture用于打开视频文件,cv2.imwrite用于将帧图像保存到文件。

3.3、多线程技术

为了提高帧提取和保存的效率,程序使用了Python的concurrent.futures库中的ThreadPoolExecutor进行多线程处理。
ThreadPoolExecutor允许我们轻松地管理和调度多个线程,特别适合I/O密集型任务。
该程序实现了从视频中每秒提取一帧并多线程保存到文件夹的功能,极大地提升了处理效率。
多线程的使用有效地利用了计算资源,减少了帧提取和保存过程中的等待时间。

4、执行效率

我的CPU型号:11th Gen Intel® Core™ i5-1135G7 @ 2.40GHz (8 CPUs), ~2.4GHz

经过我的测试:提取13分钟的视频,每秒一帧共提取出800张图,8线程,用时是 2分钟
在这里插入图片描述

5、效果展示⭐

运行程序之后,会生成一个文件夹,里面是保存的图片,效果如下图:
在这里插入图片描述

清晰度都不错,放几张给大家看一下:
在这里插入图片描述
在这里插入图片描述

此时你想要哪个素材,就不用一直在视频里面不断重复暂停、播放的过程了。

6、注意事项🔺

用了别人的素材,如果需要发成文章,比如像我这样发一篇博客的话,最好艾特原作者或者附上引用素材的链接。
我这里用到的演示视频,用于提取素材图片,来源于:
https://www.bilibili.com/video/BV1fY411H7g8?t=245.4

7、总结

通过对该代码的分析,我们可以看到利用Python的多线程技术可以显著提高视频处理任务的效率。
OpenCV库提供了强大的视频处理功能,而concurrent.futures库则简化了多线程的实现。
对于需要处理大量视频数据的应用场景,这种方法无疑是高效且实用的。

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

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

相关文章

3 IIC总线

3 IIC总线 1、基本概念1.1 IIC总线定义1.2 IIC总线协议概念 2 以AT24C02为例说明时序2.1 基本特性2.2 利用GPIO模拟IIC2.3 对AT24C02的操作2.4 重定向printf 1、基本概念 1.1 IIC总线定义 定义:两线式串行总线 两线式:说明处理器和外设之间只需两根信号…

【时间复杂度和空间复杂度】(内含超多实例练习)

【时间复杂度和空间复杂度】(内含超多实例练习) 1. 算法效率2. 时间复杂度2.1 时间复杂度的概念2.2 实例练习2.2.1 数组中搜索数据2.2.2 冒泡排序2.2.3 二分查找2.2.4 阶乘递归2.2.5 斐波那契递归 3. 空间复杂度3.1 空间复杂度的概念3.2 实例练习3.2.1 冒…

Set Hashset底层原理 LinkedSet底层原理 Treeset 31

不重复只执行一次,排序是小到大,色图是接口类 Hashset底层原理 LinkedSet底层原理 Treeset 总结

AI+云边端协同,EasyCVR视频汇聚技术赋能安防监控新生态

随着信息技术的飞速发展和数字化时代的到来,安防监控领域的技术也在不断创新和突破。EasyCVR平台的视频汇聚技术作为其中的佼佼者,以其强大的视频处理、汇聚与融合能力,在安防监控领域展现出了巨大的应用潜力和价值。本文将详细介绍EasyCVR视…

权限束缚术:windows工具自动化权限提升

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理利用工具全自动化提权的相关操作方法 因为我没有相关的环境复现,所以没有成功 不过复现的操作就是下面整理的操作 溢出漏洞提权原理 利用溢出漏洞提权,实际上就是一次判断过往的…

极简聊天室-websocket版

再写一个极简聊天室的websocket版,在本例中,websocket仅用于服务器向客户端传输信息,客户端向服务器发送信息是传统的http post方式,用axios来实现的,当然websocket本身是支持双向通信,主要是为了方便跟前面…

Selenium 无法定位元素的几种解决方案

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、frame/iframe表单嵌套 WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌的页面元素无法直接定位。 解决方法: d…

LLM大模型实战项目--基于ChatGLM2的小书虫文档阅读助手

本文介绍如此从零开始编写一个基于ChatGLM2的文档阅读助手 一、项目介绍 二、获取API接口 三、环境配置 四、代码实现 五、效果展示 一、项目介绍 小书虫📚 文档阅读助手是一个基于百度千帆大模型平台的Web应用程序,核心是清华大学训练的ChatGLM2大模…

算法加项目

1.仅加号 很简单&#xff0c;找到每次添加后最小的即可&#xff0c;这里不做演示。 2.采药 dp&#xff0c;for1数目&#xff0c;for2时间&#xff0c;简单的dp模板题目。 #include<bits/stdc.h> using namespace std; int n,m; const int N105,M105; long long a[M],b[M…

TInyWebServer面试题

一、项目介绍 &#xff08;1&#xff09;为什么要做这样一个项目&#xff1f; &#xff08;2&#xff09;介绍一下你的项目 这个项⽬是我在学习计算机⽹络和Linux socket编程过程中独⽴开发的轻量级Web服务器&#xff0c;服务器的⽹络模型是主从reactor加线程池的模式&#xf…

VMware虚拟机网络模式配置详解【原理,功能,特点层面】

VMware虚拟机网络模式配置详解【原理,功能,特点层面】 文章目录 VMware虚拟机网络模式配置详解【原理,功能,特点层面】桥接模式&#xff08;Bridged&#xff09;原理功能点介绍虚拟网络编辑器配置虚拟机配置 配置教程编辑-虚拟网络编辑器虚拟机网络配置 特点 NAT模式概念功能点…

数学建模--智能算法之蚁群优化算法

目录 基本原理 算法步骤 Python代码示例 应用领域 特点及改进 蚁群优化算法在解决哪些具体组合优化问题方面表现最为突出&#xff1f; 如何有效地改进蚁群优化算法以提高其收敛速度和避免陷入局部最优的问题&#xff1f; 蚁群优化算法与其他群体智能优化算法&#xff0…

三维旋转矩阵

前言 本文讲述三维旋转的矩阵推导&#xff0c;推导过程遵循下面的规则&#xff1a; 本文的坐标系是基于右手坐标系的逆时针旋转为正向旋转 围绕坐标轴的旋转 x x x轴 我们假设旋转的点为 P P P 假设旋转之前点 P P P的坐标为 ( x 0 , y 0 , z 0 ) (x_0,y_0,z_0) (x0​,y0​,…

CAN总线中注入拓展帧、远程帧,CAPL通用函数。

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe,博客目录大全,点击跳转👉 【测试需求】:CAN总线要求DUT 接收到非预期的扩展帧、远程帧时,通信正常,…

vulhub:nginx解析漏洞nginx_parsing

这个解析漏洞其实是PHP CGI的漏洞&#xff0c;在PHP的配置文件中有一个关键的选项cgi.fix_pathinfo默认是开启的&#xff0c;当URL中有不存在的文件&#xff0c;PHP就会向前递归解析。在一个文件/xx.jpg后面加上/.php会将 /xx.jpg/xx.php 解析为 php 文件 条件&#xff1a; Ngi…

釉面陶瓷器皿和玻璃器皿 SOR/2016-175认证

釉面陶瓷制品和釉面玻璃制品设计用于盛装食品&#xff0c;包括扁平餐具、杯子或马克杯、小号或大号凹形器皿&#xff08;杯子或马克杯除外&#xff09;以及水罐。这些法规适用于以下釉面陶瓷制品和釉面玻璃制品&#xff1a; 完全或部分由陶瓷或玻璃制成完全或部分覆盖含铅或镉…

MATLAB(12)预测模型

一、前言 在MATLAB中创建一个预测模型通常涉及多个步骤&#xff0c;包括数据准备、模型选择、训练模型、评估模型以及使用模型进行预测。以下是一个简化的例子&#xff0c;说明如何使用MATLAB中的内置函数来创建一个基于线性回归的预测模型。这个例子将使用MATLAB的fitlm函数来…

C语言函数初识

文章目录 &#x1f34a;自我介绍&#x1f34a;函数初识前言概念具体实例解释函数的实用性 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也…

院人全年无休计划背后,芒果把To C综艺玩明白了

《种地吧》掉粉闹得沸沸扬扬&#xff0c;不少禾伙人希望芒果把“十个勤天”挖走&#xff0c;毕竟芒果做综艺群像确实是一把好手&#xff0c;“院人”就是最好的例子。 在#种地吧粉丝让芒果把十个勤天挖走#的话题登上热搜之后&#xff0c;“学分们”&#xff08;院人粉丝&#…

JS等待所有方法执行完成在执行下一个方法,promise All

在工作中会遇到这样一个场景&#xff0c;前端需要拿到不同接口返回的结果在执行某个逻辑&#xff0c;当使用链式那样的方式去请求&#xff0c;等一个接口响应完在请求下一个接口&#xff0c;这种方法就会导致请求时间特别长。这个时候就可以使用promise all&#xff0c;同时请求…