pythontools实现视频的每⼀帧提取并保存
Preface
最近在做 video caption 相关,要处理⼤量视频。
今天碰到⼀个问题,就是要将数据集中的 avi 格式的视频,将其视频中的每⼀帧提取出来。之后⽤提出的 Optical Flow(光流),提取运动的光流特征。
Method 1
⽅法 1 是最简单的,⽤⼯具来完成。
具体的⽹上有很多这⽅⾯的资料,本⼈只是简单了解了⼀下如何使⽤。如下图,有⼀个名为 ffmpeg_test.avi 的视频:
在当前⽬录打开终端,输⼊如下命令:
$ffmpeg -i ffmpeg_test.avi frames_%03d.jpg -hide_banner
以上我没有指定太多的参数,实际上有很多参数可以指定,如起⽌的时间,⼏秒钟取⼀帧等等。
输⼊即可获得每⼀帧。
Method 2
下⾯就是可以⽤ cv2 模块中的 VideoCapture、VideoWriter 来提取了,具体代码如下:
#! encoding: UTF-8
import os
import cv2
import cv
videos_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)
学python看谁的视频比较好
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 frames
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) + '/'
# get the full path of each video, which will open the video tp extract frames
each_video_full_path = os.path.join(videos_src_path, each_video)
cap = cv2.VideoCapture(each_video_full_path)
frame_count = 1
success = True
while(success):
success, frame = ad()
print 'Read a new frame: ', success
params = []
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 + 1
在最后,我将每⼀帧保存为 PPM 格式。因为我需要调⽤之前的 optical flow 论⽂中的 of 程序,来提取 optical flow image(光流图)。
保存时,根据 opencv 的 Doc:,其参数的指定⽅式如上。⼀开始在这⾥跌了好⼏个跟头,因为不知道如何将参数正确的指定。
Reference
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。