kumilog.net

データ分析やプログラミングの話などを書いています。

Python+OpenCVで動画を扱う

f:id:xkumiyu:20171101180541p:plain

Ubuntu 16.04にOpenCVとFFmepgをインストールした環境を用いました。詳細は以下の記事を参照してください。

xkumiyu.hatenablog.com

動画を読み込む

OpenCVVideoCaptureをつかって動画を読み込むことができます。

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にあります。