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

'''
批量提取视频的所有帧
'''
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脚本相关推荐

  1. python批量读取视频并按指定数量抽帧

    import cv2 import time import os i=0 j=250 file1='./file1/' f = os.listdir('./video') for im in f:pr ...

  2. 【ffmpeg】最全简单实用教程|安装音频视频剪切融合拼接抽帧等

    ffmpeg 实用教程(非常全) FFmpeg Download(Mac) brew ffmpeg 常用操作(最全最简单) 音频 音频转换格式 多个音频混音 改变音量大小 音频淡入淡出 调整音频速率 ...

  3. 批量跨帧提取人脸视频中的脸部区域帧图像python

    代码实现功能 1.所有人脸视频在一个文件夹中. 2.跨帧提取帧图像. 3.截取帧图像的脸部区域. 3.将截取到的所有脸部图像保存到新文件夹中. 代码语言:python3.6 #这个代码实现了批量跨帧提 ...

  4. 不同的AI视频推理场景下,如何构建通用高效的抽帧工具?

    导读 AI算法在视频娱乐行业得到了广泛应用,在处理视频数据过程中最大瓶颈之一是视频抽帧延时,抽帧延时往往占据了整体服务的大部分时间.此外,不同的AI算法应用于不同业务时,对视频抽帧需求也不同. 对此, ...

  5. 视频抽帧:多视频、可视化、手动旋转

    一.目的 兵马未动.粮草先行. cv领域,在设计.训练你的模型之前,最重要的事情莫过于处理数据了. 很多时候,我们获取到的原始数据并非别人整理好的图片,而是一段一段的视频:这个时候,就需要我们自己抽帧 ...

  6. 游客一键视频批量剪辑视频处理伪原创软件功能都有哪些?

    游客一键视频批量剪辑视频处理伪原创软件功能都有哪些? 游客视频简介 一个有短视频创作灵感的工具 他· 小巧·智能·高效·便捷· 他拥有视频提取字幕系统 文本转语音系统 视频变速功能系统 转场特效系统 ...

  7. 解决Python OpenCV 读取视频并抽帧出现error while decoding的问题

    解决Python OpenCV 读取视频抽帧出现error while decoding的问题 1. 问题 2. 解决 3. 源代码 参考 1. 问题 读取H264视频,抽帧视频并保存,报错如下: [ ...

  8. python视频抽帧 后 前端javascript如何显示_使用OpenCV编写一个可以定时抽帧的脚本...

    一.概述 在计算机视觉数据预处理阶段,一个常用的工序是要将原始的视频数据抽帧,得到图像数据集.有时候视频很长,而我们感兴趣的场景可能只在某些较短的时段内出现.这种情况下如果对整个视频抽帧再进行人工筛选 ...

  9. python视频抽帧 后 前端javascript如何显示_python通过ffmgep从视频中抽帧的方法

    如下所示: ffmpeg中文文档:http://linux.51yip.com/search/ffmpeg ffmpeg -i test_baofeng.wmv -y -f image2 -ss 00 ...

最新文章

  1. Active report-在Web 上使用 active report
  2. 推荐一个采用方便程序员在线动画学习常用算法的良心网站
  3. python报数组越界_python数组越界
  4. jenkins svn tomcat ant自动部署
  5. 使用 ServiceStack 构建跨平台 Web 服务(转)
  6. 赛锐信息:SAP ABAP 模块化
  7. C++ 之父即将开始直播,请就位!
  8. 用windows2008服务器安装sccm2012 (安装sccm2012)
  9. oa系统怎么安装服务器配置,OA系统安装配置及维护手册-金蝶在线服务中心.DOC
  10. 逆向分析商业软件 010 Editor 及注册机编写
  11. 进程隐藏技术系列之简介
  12. 机器学习:决策树的划分依据
  13. IOS UIImageView 汤姆猫实例
  14. 如何学IT?零基础入门自学Java编程系列:java简介跟计算机常识
  15. 异步赠书:12月《Go Web编程》领航
  16. margin:0 auto是什么意思
  17. 如果你已经这样了,那你必须要跳槽了。
  18. jsp java 传值方法_JSP 页面传值方法总结(转)
  19. 基于SSM开发实现校园疫情防控管理系统
  20. 构建 django项目

热门文章

  1. java 内存分配管理_JAVA实验操作系统内存管理-最优分配,最先分配,最坏分配算法...
  2. 拒绝访问 chkdsk无法修复. 不知道怎样找回呢
  3. 孙溟㠭先生黄檗归来而篆刻“心”与“道”印章
  4. 林清玄家属致读者信:人生难得,好好修行
  5. steam 经典 android,一人历时6年开发,这款steam特别好评的无厘头游戏终于移植安卓了……...
  6. 某房地产企业人均效能分析
  7. drop table命令
  8. WPF UI框架界面开发教程(五)
  9. c语言与星星金字塔的碰撞哦
  10. 微信账号支持的格式(正则验证的方式JS实现)