1. 程式人生 > >python tools:將視訊的每一幀提取並儲存

python tools:將視訊的每一幀提取並儲存

Preface

最近在做 video caption 相關,要處理大量視訊。

Method 1

方法 1 是最簡單的,用 FFmpeg 工具來完成。

具體的網上有很多這方面的資料,本人只是簡單瞭解了一下如何使用。如下圖,有一個名為 ffmpeg_test.avi 的視訊:

在當前目錄開啟終端,輸入如下命令:

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

以上我沒有指定太多的引數,實際上有很多引數可以指定,如起止的時間,幾秒鐘取一幀等等。

輸入即可獲得每一幀。

Method 2

下面就是可以用 cv2

模組中的 VideoCaptureVideoWriter 來提取了,具體程式碼如下:

#! 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)
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 = cap.read() 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 cap.release()

在最後,我將每一幀儲存為 PPM 格式。因為我需要呼叫之前的 optical flow 論文中的 of 程式,來提取 optical flow image(光流圖)。

儲存時,根據 opencv 的 Doc:OpenCV 2.4.9 cv2.imwrite,其引數的指定方式如上。一開始在這裡跌了好幾個跟頭,因為不知道如何將引數正確的指定。

Reference