Python+OpenCVで動画を扱う


Ubuntu 16.04にOpenCVとFFmepgをインストールした環境を用いました。詳細は以下の記事を参照してください。
Ubuntu16.04にFFmpegとOpenCV3をインストールする - kumilog.train
動画を読み込む
OpenCVのVideoCaptureをつかって動画を読み込むことができます。
import cv2
infile = 'in.mp4'
video = []
cap = cv2.VideoCapture(infile)
while(cap.isOpened()):
ret, frame = cap.read()
if ret:
video.append(frame)
else:
break
cap.release()
配列のshapeは(frame, height, width, ch)となります。numpy.arrayに変換して確認することができます。
import numpy
numpy.asarray(video).shape
注意点
FFmpegがないと読み込むことができませんが、不親切なことにFFmpegがなくてもエラーも警告も発生しませんでした。cap.isOpened() == Falseとなりvideoは空の配列のままになっていました。
動画を書き込む
動画を書き込むときは、VideoWriterを使います。
outfile = 'out.avi'
fps = 30.0
codecs = 'H264'
frames, height, width, ch = video.shape
fourcc = cv2.VideoWriter_fourcc(*codecs)
writer = cv2.VideoWriter(outfile, fourcc, fps, (width, height))
for i in range(frames):
writer.write(video[i])
writer.release()
インストールした環境では、codecをH264、出力ファイルの拡張子をaviにすると動作しました。(拡張子がmp4だとうまくいかなかったです)
指定できるcodecのリストはfourcc.orgにあります。