Python将视频或者动态图gif逐帧保存为图片的方法


Posted in Python onSeptember 10, 2019

本文是基于opencv将视频和动态图gif保存为图像帧。可以根据输入视频格式的不同,修改第21行。

       对动图的处理不同于视频,PIL库包含对图像序列的基本支持。当打开gif图像时,自动加载第一帧。当图像读取完成时,抛出EOFError异常。我们可以使用seek()与tell()函数完成图像帧的读取。

       本代码的前部分是对文件的读取。数据集文件结构如下:

|——datasets
  |——action1
   action1_1.gif
   action1_2.gif
   ......
  |——action2
   action2_1.gif
   action2_2.gif
   ......
import cv2
import os
from PIL import Image
video_path = 'PATH_ROOT/datasets/' #视频或gif图像的路径
save_path = 'PATH_ROOT/save/' #保存帧的路径
action_list = os.listdir(video_path)
for action in action_list:
 if not os.path.exists(save_path+action):
  os.mkdir(save_path+action)
 video_list = os.listdir(video_path+action)
 for video in video_list:
  prefix = video.split('.')[0]
  if not os.path.exists(save_path+action+'/'+prefix):
   os.mkdir(save_path+action+'/'+prefix)
  save_name = save_path + action + '/' + prefix + '/'
  video_name = video_path+action+'/'+video
  name = video_name.split('.')[1]
  if name == "avi":
   cap = cv2.VideoCapture(video_name)
   fps = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
   fps_count = 0
   for i in range(fps):
    ret, frame = cap.read()
    if ret:
     cv2.imwrite(save_name + str(10000 + fps_count) + '.jpg', frame)
     fps_count += 1
  if name == "gif":
   im = Image.open(video_name)
   #当打开一个序列文件时,PIL库自动加载第一帧。
   #可以使用seek()函数和tell()函数在不同帧之间移动。实现保存
   try:
    while True:
     current = im.tell()
     #为了保存为jpg格式,需要转化。否则可以保存为png
     img = im.convert('RGB') 
     img.save(save_name+'/'+str(10000+current)+'.jpg')
     im.seek(current + 1)
   except EOFError:
    pass

知识点扩展:python如何将gif动态图转化成每帧图片

from PIL import Image
import os
gifFileName = 'test.gif'
#使用Image模块的open()方法打开gif动态图像时,默认是第一帧
im = Image.open(gifFileName)
pngDir = gifFileName[:-4]
#创建存放每帧图片的文件夹
os.mkdir(pngDir)
try:
 while True:
  #保存当前帧图片
  current = im.tell()
  im.save(pngDir+'/'+str(current)+'.png')
  #获取下一帧图片
  im.seek(current+1)
except EOFError:
  pass

总结

以上所述是小编给大家介绍的Python将视频或者动态图gif逐帧保存为图片的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
linux 下实现python多版本安装实践
Nov 18 Python
Python中max函数用法实例分析
Jul 17 Python
Python编程之gui程序实现简单文件浏览器代码
Dec 08 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
Jun 13 Python
浅谈Python大神都是这样处理XML文件的
May 31 Python
基于python实现对文件进行切分行
Apr 26 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
Django怎么在admin后台注册数据库表
Nov 14 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 Python
Python+tkinter实现高清图片保存
Mar 13 Python
pytorch中的 .view()函数的用法介绍
Mar 17 Python
基于Python实现流星雨效果的绘制
Mar 18 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 #Python
Python字符串中添加、插入特定字符的方法
Sep 10 #Python
详解python uiautomator2 watcher的使用方法
Sep 09 #Python
一行Python代码制作动态二维码的实现
Sep 09 #Python
python制作英语翻译小工具代码实例
Sep 09 #Python
Python pandas.DataFrame 找出有空值的行
Sep 09 #Python
Python制作词云图代码实例
Sep 09 #Python
You might like
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
我的javascript 函数链之演变
2011/04/07 Javascript
解决bootstrap中modal遇到Esc键无法关闭页面
2015/03/09 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
关于js二维数组和多维数组的定义声明(详解)
2016/10/02 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
原生JavaScrpit中异步请求Ajax实现方法
2017/11/03 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
2019/08/01 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
python  创建一个保留重复值的列表的补码
2018/10/15 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
Anconda环境下Vscode安装Python的方法详解
2020/03/29 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
Python调用jar包方法实现过程解析
2020/08/11 Python
python 实现的车牌识别项目
2021/01/25 Python
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
Urban Outfitters德国官网:美国跨国生活方式零售公司
2018/05/21 全球购物
美国领先的男士和女士内衣购物网站:Freshpair
2019/02/25 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
体育教育个人自荐信范文
2013/12/01 职场文书
感恩节活动方案
2014/01/27 职场文书
团队口号大全
2014/06/06 职场文书
2014年妇委会工作总结
2014/12/10 职场文书
红色影片观后感
2015/06/18 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
基于Nginx实现限制某IP短时间访问次数
2021/03/31 Servers
Django REST framework 限流功能的使用
2021/06/24 Python
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis