简单代码实现视频转图片_py

目录

1.安装OpenCV

环境要求

安装命令

验证安装

2. OpenCV用法

3.实现程序 


博主最近在研究深度学习,需要收集数据集进行处理,但一张张拍照真是太麻烦了

就想着,哎,能不能写一个程序,把视频转成图片不就行了?

正好,博主知道Python中就有一个库可以做到哎。

import cv2

是的,就是咱们强大的cv2库了

这是一个处理视频很好用的库,既然如此,我们就来看看我们需要的用法吧。

1.安装OpenCV

环境要求

确保你的Python版本至少为3.6以上,推荐使用Python 3.8。

安装命令

在你的Python环境中安装OpenCV非常简单,使用pip即可

pip install opencv-python

验证安装

安装完成后,可以通过以下Python代码来验证cv2模块是否正确安装

import cv2
print(cv2.__version__) 

2. OpenCV用法

大家直接去官方文档里看吧,这边就不具体介绍了,因为这个库真是太强大了。

      OpenCV官方文档           OpenCV中文文档

当然,还是推荐大家(如果英语好的话)使用官方文档,毕竟别人翻译的终究不准确。

3.实现程序 

首先我们需要创建两个文件夹目录来存储我们的图片与视频

python">import cv2#视频路径
video_path = r'D:video\1.mp4'#1.mp4就是我们的视频#图片保存路径
out_path = 'D:images/'

接下来,我们就需要对视频进行读取,我们先创建一个实例化对象

python">videocapture = cv2.VideoCapture(video_path) #创建一个实例化对象(捕捉视频)success, frame = videocapture.read() #输出success表示是否读到帧print("success is")
print(success)

这边我们运行一下代码,出现这段文件就说明我们视频读取成功了 

 这时候我们就需要设置一下读取视频的参数了,代码中注释的很清楚,就不过多解释

python">is_all_frame = True #是否取所有帧sta_frame = 1 # 起始帧end_frame = 1000 #结束帧time_interval = 8 #时间间隔,多少帧存一次

 根据我们的参数可以知道,我们每8帧就需要存储一次,自然就需要一个循环来不停的存储我们的

图片。有了循环,自然就得有循环结束的条件。接下来,看代码。

python">i = 0
j = 0  # 为了编号,防止图片编号跳着来 1,8,16....
while success:i += 1if i % time_interval == 0:if not is_all_frame:if sta_frame <= i <= end_frame: #i在启始帧和结束帧之间运行循环j += 1print("save frame", j)save_image(out_path, frame, j)elif i > end_frame:breakelse:j += 1print("save frame", j)save_image(out_path, frame, j)# 每次调用读取一帧success, frame = videocapture.read()# save_image(out_path, frame, j)保存图片的函数,暂时可以不看,下面会讲
# 变量j也可以暂时不看

循环有了,我们就要写我们需要用的具体函数了。

这边我们定义一个save_image() 函数,设置几个参数,分别存放我们的目录,每一帧图片,图

片的编号 j 。

为什么我们需要编号呢?

如果我们直接用frame作为编号,就会出现编号跳跃的情况,8,16,24...

这样看着会很难受,引入 j 只是为了让我们看的方便些。

接下来,看代码

python">def save_image(addr, image, num):  #目录,每一帧,编号address = addr + 'img_' + str(num) + '.jpg' #路径以及文件保存的名字print(address) #输出路径,为了直观一点cv2.imwrite(address, image) #转换图片的主要程序

这样,我们就可以完成一个简单的视频转图片的程序了。

4.完整代码

python">import cv2#这边的路径是博主自己进行深度学习的目录,改为你们自己的就可以了#视频路径
video_path = r'D:\yolo\yolov5-6.0\labelimg\video\1.mp4'
#图片路径
out_path = 'D:/yolo/yolov5-6.0/labelimg/images/'# 保存图片函数
def save_image(addr, image, num):  #目录,图片,编号address = addr + 'img_' + str(num) + '.jpg'print(address)cv2.imwrite(address, image)is_all_frame = True #是否取所有帧
sta_frame = 1 # 起始帧
end_frame = 1000 #结束帧# 这边可以根据需要自定义
# 拍摄视频 1s有60帧 (具体看自己相机设置)
time_interval = 8 #时间间隔,多少帧存一次videocapture = cv2.VideoCapture(video_path) #创建一个实例化对象(捕捉视频)
success, frame = videocapture.read() #success表示是否读到帧
print("success is")
print(success)i = 0
j = 0  # 为了编号,防止图片编号跳着来 1,8,16....
while success:i += 1if i % time_interval == 0:if not is_all_frame:if sta_frame <= i <= end_frame:j += 1print("save frame", j)save_image(out_path, frame, j)elif i > end_frame:breakelse:j += 1print("save frame", j)save_image(out_path, frame, j)# 每次调用读取一帧success, frame = videocapture.read()

 

 

 

 


http://www.ppmy.cn/news/1525201.html

相关文章

tabBar设置底部导航栏

如果应用是一个多 tab 应用&#xff0c;可以通过 tabBar 配置项指定一级导航栏&#xff0c;以及 tab 切换时显示的对应页&#xff0c;简单来说就是像美团外卖下面的导航栏一样可以任意切换 1.首先创建三个页面&#xff0c;在页面里面可以写一些东西或者放一张图片方便区分。 2.…

http网络请求与下载进度

Http_request 目录 一、XMLHttpRequest 在使用 Fetch API 进行网络请求时&#xff0c;原生的 Fetch API 并不直接支持获取下载进度的功能&#xff0c;因为 Fetch API 主要是基于 Promise 的&#xff0c;它主要关注于请求的成功或失败&#xff0c;以及响应数据的处理&#xff…

微信小程序开发——比较两个数字大小

在这里我们使用的工具是 需要自行安装和配置。 在微信小程序中比较两个数字大小有以下几种方式&#xff1a; 一、普通条件判断 在小程序的.js 文件中&#xff0c;先定义两个数字&#xff0c;如let num1 5; let num2 3;。通过if - else if - else语句&#xff0c;根据num1与…

MVC设计模式与delegate,tablview,Appdelegate,SceneDelegate

一、MVC MVC就是Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09; 例如上面的 excel表&#xff0c; 数据、数据结构就是模型Model 根据数据形成的直观的、用户能直接看见的柱形图是视图View 数据构成的表格…

假期学习-- iOS 通知详解

iOS 通知详解 数据结构 从我们之前使用通知的流程和代码来看&#xff0c;通知其实就是一个单例&#xff0c;方便随时访问。 NSNotificationCenter&#xff1a;消息中心 这个单例类中主要定义了两个表&#xff0c;一个存储所有注册通知信息的表的结构体&#xff0c;一个保存…

模版方法模式template method

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架&#xff0c; 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

神经网络学习笔记——如何设计、实现并训练一个标准的前馈神经网络

1.从零设计并训练一个神经网络https://www.bilibili.com/video/BV134421U77t/?spm_id_from333.337.search-card.all.click&vd_source0b1f472915ac9cb9cdccb8658d6c2e69 一、如何设计、实现并训练一个标准的前馈神经网络&#xff0c;用于手写数字图像的分类&#xff0c;重…

【SpringBoot3】面向切面 AspectJ AOP 使用详解

文章目录 一、AspectJ介绍二、简单使用步骤1、引入依赖2、定义一个Aspect3、开启AOP支持 三、AOP 核心概念四、切点&#xff08;Pointcut&#xff09;1. execution2. within3. this & target4. args & args5. within & target & annotation 五、通知&#xff0…

Unix时间戳与C语言的time.h库函数

目录 Unix时间戳介绍 UTC/GMT 时间与秒计数器转换代码 time.h库函数 Unix时间戳介绍 Unix 时间戳&#xff08;Unix Timestamp&#xff09;定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数&#xff0c;不考虑闰秒 时间戳存储在一个秒计数器中&#xff0c;秒计数器…

15.5 创建监控控制平面的service

本节重点介绍 : k8s中service的作用和类型创建k8s控制平面的service 给prometheus采集用&#xff0c; 类型clusterIp kube-schedulerkube-controller-managerkube-etcd service的作用 Kubernetes Service定义了这样一种抽象&#xff1a; Service是一种可以访问 Pod逻辑分组…

MATLAB求解0-1线性规划问题的详细分析

引言 0-1线性规划是整数规划中的一种特殊形式&#xff0c;它广泛应用于资源分配、工厂选址、投资组合优化、物流运输等多个领域。0-1线性规划的特点是&#xff0c;决策变量只能取0或1的离散值&#xff0c;通常用于描述“是-否”决策问题。随着计算机技术的发展&#xff0c;数学…

《仙境传说RO:新启航》游戏攻略:VMOS云手机提升装备获取辅助!自由交易,辅助挂机操作!

在《仙境传说RO&#xff1a;新启航》中&#xff0c;想要快速提升战斗力并获取顶级装备&#xff0c;玩家需要熟练掌握多种获取资源与提升角色的途径。为了让玩家更加轻松地享受游戏&#xff0c;VMOS云手机推出了专属定制版云手机&#xff0c;内置游戏安装包&#xff0c;不需要重…

【c++实现】统计上升四元组

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 &#x1f308;C专栏&#xff1a;C 文章目录 1. 题目描述2. 解释3. DP前缀和枚举 1. 题目描…

使用 nvm 管理 node 版本:如何在 macOS 和 Windows 上安装使用nvm

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、nvm的安装与基本使用2.1 macOS安装nvm2.1.1 使用 curl 安装2.1.2 使用 Homebrew 安装 2.2 Windows安装nvm2.2.1 下载 nvm-windows2.2.2 安装 nvm-windows 2.3 安装node2.4 切换node版本 三、常见问题及解决方案…

graphQL 参数使用报错问题

query{getMembers(sid:0,nodeId:"ns6;i7896"){methods} } //报错 "message": "Field \"methods\" of type \"[UaMethod]\" must have a selection of subfields. Did you mean \"methods { ... }\"?",这个错误信…

观众登记2025中国(深圳)国际智能手机供应链展览会

时间&#xff1a;2024年4月9-11日 地点&#xff1a;深圳会展中心 ◆展会背景background&#xff1a; 近年来&#xff0c;国内手机品牌在全球市场上的影响力不断增强&#xff0c;华为、OPPO、VIVO和小米等…

实战案例(2)防火墙+二交换机VLAN组网

案例二&#xff1a;防火墙充当三层交换机与路由器角色功能进行组网 拿到这样的拓扑后&#xff0c;首先要了解好客户的需求&#xff0c;然后根据需求进行划分 比如客户那边有监控跟办公网络&#xff0c;可以通过VLAN划分不同的区域&#xff0c;然后二层交换机对接终端的口划入到…

Spring Boot属性注入的多种方式!

Spring Boot的一个问题&#xff0c;证明你是不是真正的 "会用" Spring boot ?Spring Boot的一个问题&#xff0c;直接暴露你是不是真正使用Spring Boothttps://mp.weixin.qq.com/s?__bizMzkzMTY0Mjc0Ng&mid2247484040&idx1&sn64ad15d95e44c874cc890973…

国产服务器CPU发展分析

CPU行业概览&#xff1a;信创带动服务器CPU国产化 目前CPU行业由两大生态体系主导&#xff1a;一是基于X86指令系统和Windows操作系统的Wintel体系&#xff0c;主要用于服务器与电脑等&#xff1b;二是基于ARM指令系统和Android操作系统的AA体系&#xff0c;主要用于移动设备…

机器学习和深度学习存在显著区别

机器学习和深度学习在多个方面存在显著的区别&#xff0c;以下是对这些区别的详细阐述&#xff1a; 定义与起源 机器学习&#xff1a;是人工智能的一个分支领域&#xff0c;它使计算机能够从数据中学习并改进其性能&#xff0c;而无需进行显式编程。机器学习起源于20世纪50年代…