当前位置: 首页 > news >正文

视频处理之视频抽帧的python脚本

在计算机视觉研究中,处理视频的时候,往往需要将视频抽帧成图片。如果多个视频都存放在一个文件夹里,并且希望抽帧出来的图片,以一个视频对应一个文件夹的形式存放,可以用以下代码,抽帧频率可自己手动修改,下面是抽所有帧的代码:

'''
批量提取视频的所有帧
'''
import os
import cv2
#视频地址
videos_src_path = '/home/videos/'
#存放图片的地址
videos_save_path = '/home/frames/'#返回videos_src_path路径下包含的文件或文件夹名字的列表(所有视频的文件名),按字母顺序排序
videos = os.listdir(videos_src_path)
for each_video in videos:#获取每个视频的名称each_video_name, _ = each_video.split('.')#创建目录保存抽出的帧os.mkdir(videos_save_path + each_video_name)#获取保存图片的完整路径,每个视频的图片帧存在以视频名为文件名的文件夹中each_video_save_full_path = os.path.join(videos_save_path, each_video_name) + '/'#每个视频的完整路径each_video_full_path = os.path.join(videos_src_path, each_video)#读入视频cap = cv2.VideoCapture(each_video_full_path)print(each_video_full_path)frame_count = 1success = Truewhile (success):#提取视频帧,success为是否成功获取视频帧(true/false),第二个返回值为返回的视频帧success, frame = cap.read()# 如果想间隔比如25帧抽一张,可以在下方if里加条件:frame_count % 25 == 0if success == True:#存储视频帧,%04d则每张图片以4位数命名,比如0001.jpgcv2.imwrite(each_video_save_full_path + "%04d.jpg" % frame_count, frame)frame_count += 1

主要用到的是cv2里的cv2.VideoCapture()read()

上面是所有视频存储在一个文件夹里,即如下的组织结构:

—videos—video1.mp4—video2.mp4—video3.mp4—video4.mp4...

但很多数据集,它不是将所有视频放在一个文件夹下,而是有各级子文件夹,每个子文件夹里放有同名的视频,而是如下这种组织形式:

—videos—user_0—run_0—video.mp4—run_1—video.mp4—run_2—video.mp4...—user_1—run_0—video.mp4—run_1—video.mp4...—user_2...

这个时候就要递归一下各级文件夹了,而且抽出的视频帧的文件夹的命名也不能是每个视频的名字,因为每个视频名字都一样,所以这个时候不仅要递归,而且要记录每个视频的路径,然后以视频的路径来命名这些图片文件夹。
我们先将每个视频的路径保存在txt文件里:

import  os
from os import pathdef scanner_video(inputSrc,video_list):file_list = os.listdir(inputSrc)for file in file_list:curr_file=path.join(inputSrc,file)#递归搜索if(path.isdir(curr_file)):scanner_video(curr_file,video_list)else:curr_file_name=curr_file.split(".")curr_file_type=curr_file_name[len(curr_file_name)-1]# 各种格式视频if curr_file_type=="mp4"or curr_file_type=="avi"or curr_file_type=="wmv" or curr_file_type=="vm4":video_list.append(curr_file)return video_listif __name__ == '__main__':inputSrc= '/home/Finalised/'# 保存txt的路径outputSrc= '/home/videoList.txt'video_list=[]video_list=scanner_video(inputSrc,video_list)f = open(outputSrc, 'w', encoding="utf-8", newline='\n')for file in video_list:f.write(file)f.write("\n")f.close()

然后读取这个videoList.txt文件,修改之前的代码,之前是直接按照文件夹下的视频名称来拼出每个视频的路径,要保存的图片文件夹的名字也是按照视频名称。现在每个视频的路径从txt文件中去读取,然后图片文件夹的名字是按照视频路径的一部分来截取,比如截取出 User_11/run_1,然后将"/“替换成”-"
即可得到User_11-run_1,这里就是第12个文件夹里的第2个文件夹里的视频抽帧后的图片被保存到的文件夹的名字。
注意的点是,txt的每一行的末尾都有个\n符号,得用strip('\n')来删除

import  os
import cv2# 图片保存路径
videos_save_path = '/home/dataset/frames/' 
lines = 0# 从txt中找每个视频的路径for each_video in open('/home/videoList.txt', encoding='utf-8'):# if each_video == '\n':#    continue# 原先的这种方式不行:这一行是换行符的话就跳过—— ——但换行符在each_video末尾,txt里没有空行# strip删除指定字符each_video = each_video.strip('\n')lines += 1last = each_video.rfind('/') # 返回最后一个'/'的下标# 根据实际路径情况设置切片的下标each_video_name = each_video[54:last] # /User_11/run_1/each_video_name = each_video_name.replace('/','-')#创建目录,每个来保存图片帧os.mkdir(videos_save_path + each_video_name)#获取保存图片的完整路径,每个视频的图片帧存在以视频名为文件名的文件夹中each_video_save_full_path = os.path.join(videos_save_path, each_video_name) + '/'#读入视频cap = cv2.VideoCapture(each_video)#输出调试信息print(cap.isOpened())print(each_video)frame_count = 1success = Truewhile (success):#提取视频帧,success为是否成功获取视频帧(true/false),第二个返回值为返回的视频帧success, frame = cap.read()# print(success)if success == True:#存储视频帧cv2.imwrite(each_video_save_full_path + "%04d.jpg" % frame_count, frame)frame_count += 1	# 查看读取到的txt的行数,此时就知道所有视频都抽取完了
print(lines)

当然也可以不用保存在txt里,可以两份代码合一块,直接读取视频的路径然后挨个抽帧。
但是先将视频的路径保存在txt文档里相对还是更有容错空间,比如部分视频没抽成功,可以修改txt的内容为没有读到的这批视频,然后再次运行后面这份代码。

相关文章:

视频处理之视频抽帧的python脚本

在计算机视觉研究中,处理视频的时候,往往需要将视频抽帧成图片。如果多个视频都存放在一个文件夹里,并且希望抽帧出来的图片,以一个视频对应一个文件夹的形式存放,可以用以下代码,抽帧频率可自己手动修改&a…...

【youcans 的 OpenCV 学习课】22. Haar 级联分类器

专栏地址:『youcans 的图像处理学习课』 文章目录:『youcans 的图像处理学习课 - 总目录』 【youcans 的 OpenCV 学习课】22. Haar 级联分类器 3. Haar 特征及其加速计算3.1 Haar 特征3.2 Haar 特征值的计算3.3 积分图像3.4 基于积分图像加速计算 Haar 特…...

如何避免知识盲区 《人生处处是修行》 读书笔记

如何避免知识盲区 多元化学习:不要只关注自己擅长的领域,应该尝试学习其他领域的知识,例如文学、艺术、科学等。 拓宽阅读:阅读不同领域的书籍、文章、博客等,可以帮助你了解更多的知识和观点。 参加培训和课程&…...

vue返回上一页自动刷新方式

再vue中,返回上一页时:如果页面是打开的状态,页面不会自动刷新,会保持着上次跳转的状态不更新; 原因:vue-router的切换不同于传统的页面切换,而是路由之间的切换,其实就是组件之间的…...

查询SERVER正在执行的SQL语句

--方法一 select * from master..sysprocesses SELECT distinct [Spid] session_Id, ecid, [Database] DB_NAME(sp.dbid), [User] nt_username, [Status] er.status, [Wait] wait_type, [Individual Query] SUBSTRING(qt.text, er.statement_start_offset / 2,…...

现代密码学--结课论文---《70年代公钥传奇》

摘要:在70年代之前,密码学主要被军方用于通信保护。密码学的主要研究也是由情报机构(GCHQ、NSA等)或IBM等企业运营的获得许可的实验室中进行。这时公众几乎无法获得密码学知识,直到由三位密码学家Hellman、Diffie和Mer…...

cf1348B phoenix and beauty(双指针滑动窗口的构造)

C 题面 Problem - 1348B - Codeforces 输出标准输出 凤凰网喜欢美丽的数组。如果一个数组中所有长度为k的子数组 的子数都有相同的总和,那么这个数组就是美丽的。一个数组的子数组是任何连续元素的序列。 凤凰网目前有一个数组a 的长度为n . 他想在他的数组中插入…...

一文读懂JAVA的hashCode方法:原理、实现与应用

目录 一、概述二、实现原理和重写规则三、如何重写hashCode方法3.1 Objects.hash()方法3.2 Apache HashCodeBuilder.3.3 Google Guava3.4 自定义哈希算法四、hashcode和equals的联系五、注意事项和建议5.1 注意事项5.2 建议六、总结一、概述 在Java中,每个对象都有一个hashCod…...

RocketMQ部署

一 安装mq 1.下载RocketMQ 本教程使⽤的是RocketMQ4.7.1版本,建议使⽤该版本进⾏之后的demo训练。 运⾏版:https://www.apache.org/dyn/closer.cgi?pathrocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip 源码:https://www.apache.org…...

43岁程序员,投了上万份简历都已读不回,只好把年龄改成40岁,这才有了面试机会,拿到了offer!...

40多岁找工作有多难? 一位43岁的程序员讲述了自己找工作的经历: 80年,大专,目前没到43周岁,年前被裁,简历上的年龄是42岁,两个多月投了上万份简历,99.5%是已读未回。后来改变策略把简…...

MySQL分区表相关知识总结

1.创建分区表: create table t(col11 int null, col22 …) engineinnodb partition by hash(col33) partitions 44; create table t(col11 int null, col22 …) engineinnodb partition by range(id) (partition p0 values less than (10), partition p1 values les…...

outlook邮箱pc/mac客户端下载 含最新版

新的 Outlook for Windows or mac 为 Outlook 应用带来了最新功能、智能辅助功能和新的新式简化设计。 你可以根据自己的风格定制它,并使用新的 Outlook for Windows/mac 执行更多操作! 览版,与我们一起开始旅程,并帮助我们塑造新…...

缓存雪崩、缓存穿透、缓存击穿分别是什么?如何解决?

缓存中存放的大多都是热点数据,目的就是从缓存中获取数据,而不用直接访问数据库,从而提高查询效率 缓存雪崩 概念 指缓存在同一时间大面积失效,后面的请求直接访问数据库,导致数据库短时间内压力过大而崩溃&#xff…...

VBA实战篇学习笔记02 Err错误处理

文章目录 专题VI 错误处理课时38 常见错误类型错误代码13 :类型不匹配错误代码91: 对象变量或者with变量未设置错误代码1004: 视具体错误类型而变化 课时39 Err错误处理On Error Resume Next :Resume语句:Resume Next语句:未知错误:Exit SubOn Error Goto 0 专题VI 错误处理 课…...

【Git】拉取代码/提交代码

1.从将本地代码放入远程仓库 (如果有分支的情况) [git checkout xx切换分支后 git add . 将本地所有改动文件新增 commit之后 git push(将代码全部提交)] 分支操作 #查看分支 git branch #创建分支 git branch test #切换分支 git checkout test #修改代码 #提交代码git ad…...

产品预览 | 系统仿真与三维专业场仿真融合——MWORKS模型降阶工具箱

1 引言 近二十年来,数字化技术迅猛发展,以美国和中国提出装备数字工程为标志,人类迈入全新的数字化时代。装备数字化需要对装备的运行状态和行为进行准确的模拟和预测,这就需要利用系统仿真技术。系统仿真技术能够综合考虑装备的…...

我们都遇到过的这些ajax代码到底什么意思?

hello,我是小索奇,本篇文章给大家带来ajax中常用的一些代码,为什么写这些呢? 因为小索奇也看黑马、尚硅谷等老师的视频,在学习java的时候经常会介绍ajax,导致很多不了解的伙伴一脸懵然,以防万一…...

TiDB实战篇-TiCDC

目录 简介 原理 使用场景 使用限制 硬件配置 部署 在安装TiDB的时候部署 扩容部署 操作 管理CDC 管理工具 查看状态 创建同步任务 公共参数 CDC任务同步到MySQL实战 同步命令 查看所有的同步任务 同步任务的状态 管理同步任务 查看一个同步信息的具体情况 …...

ElasticSearch第十七讲 ES索引别名的使用

索引别名 ES中可以为索引添加别名,一个别名可以指向到多个索引中,同时在添加别名时可以设置筛选条件,指向一个索引的部分数据,实现在关系数据库汇总的视图功能,这就是ES中别名的强大之处。别名是一个非常实用的功能,为我们使用索引提供了极大的灵活性,许多ES的API都支持…...

第二个机器学习应用:乳腺癌数据集在决策树模型上的挖掘

目录 决策树优化与可视化 1 决策树分类 2 决策树可视化 3 显示树的特征重要性 特征重要性可视化 决策树回归 1 决策树回归 决策树优化与可视化 1 决策树分类 from sklearn.datasets import load_breast_cancer from sklearn.tree import DecisionTreeClassifier from sk…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...

Vue ③-生命周期 || 脚手架

生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...