python tools:将视频的每一帧提取并保存

2024-05-08 03:48

本文主要是介绍python tools:将视频的每一帧提取并保存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Preface

最近在做 video caption 相关,要处理大量视频。

今天碰到一个问题,就是要将 YoutubeClips 数据集 中的 avi 格式的视频,将其视频中的每一帧提取出来。之后用 High accuracy optical flow estimation based on a theory for warping 提出的 Optical Flow(光流),提取运动的光流特征。

Method 1

方法 1 是最简单的,用 FFmpeg 工具来完成。

具体的网上有很多这方面的资料,本人只是简单了解了一下如何使用。如下图,有一个名为 ffmpeg_test.avi 的视频:

在当前目录打开终端,输入如下命令:

$ffmpeg -i ffmpeg_test.avi frames_%03d.jpg -hide_banner

以上我没有指定太多的参数,实际上有很多参数可以指定,如起止的时间,几秒钟取一帧等等。

输入即可获得每一帧。

Method 2

下面就是可以用 cv2 模块中的 VideoCaptureVideoWriter 来提取了,具体代码如下:

#! encoding: UTF-8import osimport cv2
import cvvideos_src_path = '/home/ou-lc/chenxp/Downloads/Youtube/youtube_select'
videos_save_path = '/home/ou-lc/chenxp/Downloads/Youtube/youtube_frames'videos = os.listdir(videos_src_path)
videos = filter(lambda x: x.endswith('avi'), videos)for each_video in videos:print each_video# get the name of each video, and make the directory to save frameseach_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) + '/'# get the full path of each video, which will open the video tp extract frameseach_video_full_path = os.path.join(videos_src_path, each_video)cap  = cv2.VideoCapture(each_video_full_path)frame_count = 1success = Truewhile(success):success, frame = cap.read()print 'Read a new frame: ', successparams = []params.append(cv.CV_IMWRITE_PXM_BINARY)params.append(1)cv2.imwrite(each_video_save_full_path + each_video_name + "_%d.ppm" % frame_count, frame, params)frame_count = frame_count + 1cap.release()

在最后,我将每一帧保存为 PPM 格式。因为我需要调用之前的 optical flow 论文中的 of 程序,来提取 optical flow image(光流图)。

保存时,根据 opencv 的 Doc:OpenCV 2.4.9 cv2.imwrite,其参数的指定方式如上。一开始在这里跌了好几个跟头,因为不知道如何将参数正确的指定。

Reference

  1. http://www.bugcodemaster.com/article/extract-images-frame-frame-video-file-using-ffmpeg
  2. http://stackoverflow.com/questions/33311153/python-extracting-and-saving-video-frames
  3. http://stackoverflow.com/questions/12216333/opencv-imread-imwrite-increases-the-size-of-png

这篇关于python tools:将视频的每一帧提取并保存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969222

相关文章

ant和解决Unable to locate tools.jar错误

首先说明 ant下载不用安装 直接解压缩即可,放到任意目录都可以,最好目录不包括中文 , 并且我出现的问题在于  我改了环境变量后,发现没有成功, 重启了一下命令行窗口,就直接成功了(这是让人最容易忽视的 因为就算你改成功了但是不重启 也会显示不成功)。 开始是显示Unable to locate tools.jar  Expected to find it in D:/Program File

iOS 加载大量本地视频优化

一、问题的产生 1.1 发现问题 最近开发了一个视频剪辑的APP,其中有这么一个功能,对原视频进行剪辑编辑好之后,可以直接导出到相册,同时APP也会将这个视频保存到本地(沙盒),然后APP专门有一个“我的作品”界面来展示所有存储在本地的视频。在自己做测试的时候,发现点击“我的作品”页面,需要比较长的时间才能响应,而且视频越多响应时间越长。于是我猜想可能是因为同时加载大量视频导致的。 1.2

利用opencv与Socket实现树莓派获取摄像头视频和灰度重心发送到电脑

使用树莓派原装CSI摄像头录制视频并利用灰度重心法获取重心,将图像和重心数据通过Socket实时传输到电脑上 因为需要实现程序一启动便打开摄像头计算数据,同时启动Socket服务器等待客户端连接,所以利用C++11中的thread库通过多线程实现程序 树莓派-服务端 #include <iostream>#include <unistd.h>#include <cstring>#inc

Zen of Python -Python之禅

在浏览Python官方文档时无意发现了这个彩蛋,只需在终端中import this The Zen of Python, by Tim PetersBeautiful is better than ugly.Explicit is better than implicit.Simple is better than complex.Complex is better than compli

Python内置函数oct()详解

Python中的oct()函数是一个内置函数,用于将一个整数转换成它的八进制字符串表示。 函数定义 oct()函数的基本语法如下: oct(x) x:一个整数。 函数返回x的八进制表示,以字符串形式。 基本用法 将整数转换为八进制 number = 64print(oct(number)) # 输出: '0o100' 转换负整数 number = -64print(o

web项目引用html5 video标签实现视频播放的坑

项目框架:SpringMVC 最近项目中用到视频播放,打算采用html5 的video标签实现网页视频播放,考虑到兼容性与样式又采用了jquery的video.js插件,使用过程中视频播放都没问题,但是在视频播放的时候运行容器(jetty、tomcat)都会报IO异常: tomcat: 2017-07-04 12:24:57,167 [http-nio-8888-exec-9] ERROR

跨域数据流动:数据提取过程中的治理与安全双轮驱动

跨域数据流动:数据提取过程中的治理与安全双轮驱动 随着信息技术的飞速发展,跨域数据流动已成为现代社会的常态。从医疗记录到金融交易,从社交媒体到企业运营,数据在各个领域之间频繁交换,为社会发展带来了极大的便利。然而,这种跨域数据流动也带来了治理和安全的双重挑战。本文将从治理和安全两个维度,探讨在数据提取过程中的双轮驱动策略。 一、数据治理:构建有序的跨域数据流动体系 在跨域数据流动的背景下,数

Python筑基之旅-溯源及发展

目录 一、Python的起源 二、Python的版本更替及变化 三、Python的优缺点 四、Python的发展方向 五、Python之禅 六、推荐专栏/主页: 1、Python函数之旅:Functions 2、Python算法之旅:Algorithms 3、个人主页:https://myelsa1024.blog.csdn.net/ ​​​​​​​ 一、Python

Python专题:十六、异常处理(2)

异常的预判和防护 import randomnum = random.randint(1, 100) # 获得一个随机数is_done = False # 是否猜中的标记count = 0 # 玩家猜了几次while not is_done:guess = int(input('请输入一个[1, 100]的整数:'))if guess == num:is_done = Trueelif

理解 Python 中的 `super()` 与 `__init__()` 方法

在 Python 的面向对象编程中,super() 函数和 __init__() 方法是两个非常重要的概念。它们在类的继承和初始化过程中扮演着关键的角色。本文将深入探讨这两个概念的工作原理,并通过示例代码来展示它们的使用。 基本原理 __init__() 方法 __init__() 是一个特殊的方法,也称为类的构造器。当你创建一个类的新实例时,Python 会自动调用这个方法。它通常用于初始