视频处理之视频抽帧的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脚本相关推荐
- python批量读取视频并按指定数量抽帧
import cv2 import time import os i=0 j=250 file1='./file1/' f = os.listdir('./video') for im in f:pr ...
- 【ffmpeg】最全简单实用教程|安装音频视频剪切融合拼接抽帧等
ffmpeg 实用教程(非常全) FFmpeg Download(Mac) brew ffmpeg 常用操作(最全最简单) 音频 音频转换格式 多个音频混音 改变音量大小 音频淡入淡出 调整音频速率 ...
- 批量跨帧提取人脸视频中的脸部区域帧图像python
代码实现功能 1.所有人脸视频在一个文件夹中. 2.跨帧提取帧图像. 3.截取帧图像的脸部区域. 3.将截取到的所有脸部图像保存到新文件夹中. 代码语言:python3.6 #这个代码实现了批量跨帧提 ...
- 不同的AI视频推理场景下,如何构建通用高效的抽帧工具?
导读 AI算法在视频娱乐行业得到了广泛应用,在处理视频数据过程中最大瓶颈之一是视频抽帧延时,抽帧延时往往占据了整体服务的大部分时间.此外,不同的AI算法应用于不同业务时,对视频抽帧需求也不同. 对此, ...
- 视频抽帧:多视频、可视化、手动旋转
一.目的 兵马未动.粮草先行. cv领域,在设计.训练你的模型之前,最重要的事情莫过于处理数据了. 很多时候,我们获取到的原始数据并非别人整理好的图片,而是一段一段的视频:这个时候,就需要我们自己抽帧 ...
- 游客一键视频批量剪辑视频处理伪原创软件功能都有哪些?
游客一键视频批量剪辑视频处理伪原创软件功能都有哪些? 游客视频简介 一个有短视频创作灵感的工具 他· 小巧·智能·高效·便捷· 他拥有视频提取字幕系统 文本转语音系统 视频变速功能系统 转场特效系统 ...
- 解决Python OpenCV 读取视频并抽帧出现error while decoding的问题
解决Python OpenCV 读取视频抽帧出现error while decoding的问题 1. 问题 2. 解决 3. 源代码 参考 1. 问题 读取H264视频,抽帧视频并保存,报错如下: [ ...
- python视频抽帧 后 前端javascript如何显示_使用OpenCV编写一个可以定时抽帧的脚本...
一.概述 在计算机视觉数据预处理阶段,一个常用的工序是要将原始的视频数据抽帧,得到图像数据集.有时候视频很长,而我们感兴趣的场景可能只在某些较短的时段内出现.这种情况下如果对整个视频抽帧再进行人工筛选 ...
- python视频抽帧 后 前端javascript如何显示_python通过ffmgep从视频中抽帧的方法
如下所示: ffmpeg中文文档:http://linux.51yip.com/search/ffmpeg ffmpeg -i test_baofeng.wmv -y -f image2 -ss 00 ...
最新文章
- Active report-在Web 上使用 active report
- 推荐一个采用方便程序员在线动画学习常用算法的良心网站
- python报数组越界_python数组越界
- jenkins svn tomcat ant自动部署
- 使用 ServiceStack 构建跨平台 Web 服务(转)
- 赛锐信息:SAP ABAP 模块化
- C++ 之父即将开始直播,请就位!
- 用windows2008服务器安装sccm2012 (安装sccm2012)
- oa系统怎么安装服务器配置,OA系统安装配置及维护手册-金蝶在线服务中心.DOC
- 逆向分析商业软件 010 Editor 及注册机编写
- 进程隐藏技术系列之简介
- 机器学习:决策树的划分依据
- IOS UIImageView 汤姆猫实例
- 如何学IT?零基础入门自学Java编程系列:java简介跟计算机常识
- 异步赠书:12月《Go Web编程》领航
- margin:0 auto是什么意思
- 如果你已经这样了,那你必须要跳槽了。
- jsp java 传值方法_JSP 页面传值方法总结(转)
- 基于SSM开发实现校园疫情防控管理系统
- 构建 django项目
热门文章
- java 内存分配管理_JAVA实验操作系统内存管理-最优分配,最先分配,最坏分配算法...
- 拒绝访问 chkdsk无法修复. 不知道怎样找回呢
- 孙溟㠭先生黄檗归来而篆刻“心”与“道”印章
- 林清玄家属致读者信:人生难得,好好修行
- steam 经典 android,一人历时6年开发,这款steam特别好评的无厘头游戏终于移植安卓了……...
- 某房地产企业人均效能分析
- drop table命令
- WPF UI框架界面开发教程(五)
- c语言与星星金字塔的碰撞哦
- 微信账号支持的格式(正则验证的方式JS实现)