ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【python/OpenCV】OpenCVで動画ファイルの読み込みと保存の方法

 今までpythonOpenCVを使ってWebカメラや静止画の加工などはやっていましたが、動画ファイルを扱ったことがなかったのでその備忘録です。(※ちなみにOpenCVでは音声は扱えません)

 OpenCVpythonの他にどうやらopencv_ffmpegを入れてないと使えないようなので、そこは各自で入れておいてください。

 では始めます。


1:動画ファイルの読み込み
 OpenCVで動画の読み込みを行うには以下の記述でできます。

import cv2

video = cv2.VideoCapture("./movie/test.mp4") # 引数がファイルパス
ret, frame = video.read() # 1フレーム読み込み

 基本的にWebカメラを扱う時と同じ感じで、引数にファイルパスを指定してあげるだけです。
 フレームごとの読み込みもread関数で行えばよいです。

 また動画の各情報も以下のようにして取得できます。

width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) # 動画の画面横幅
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 動画の画面縦幅
frame_count = int(video.get(cv2.CAP_PROP_FRAME_COUNT)) # 総フレーム数
frame_rate = int(video.get(cv2.CAP_PROP_FPS)) # フレームレート(fps)

 この他にも取得できる情報は色々あるようなので、参考資料にあるサイト様を参照してください。


2:動画ファイルの保存
 動画の読み込み方法がわかったので次は動画ファイルとしての保存方法です。
 その方法は以下の記述でできます。

import cv2

frame_rate = 24.0 # フレームレート
size = (640, 480) # 動画の画面サイズ

fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') # ファイル形式(ここではmp4)
writer = cv2.VideoWriter('./result/outtest.mp4', fmt, frame_rate, size) # ライター作成

ret, frame = video.read()
writer.write(frame) # 画像を1フレーム分として書き込み

writer.release() # ファイルを閉じる

「cv2.VideoWriter_fourcc」関数でファイル形式を指定します。大体mp4形式しか使わないとは思います。

「cv2.VideoWriter」関数でファイルとして保存するライターを作成します。第一引数が保存ファイルパス、第二引数がファイル形式、第三引数がフレームレート、第四引数が画面サイズとなっています。

 ライターに1フレーム分として書き込む時は「write」関数の引数に画像を指定してやればOKです。


3:サンプル
 動画の読み込みと保存方法がわかったので適当に元の動画のコピーを作成するサンプルを作りました。

・movieTest.py

import cv2

print("---start---")

#動画ファイルを読み込む
video = cv2.VideoCapture("./movie/test.mp4")

# 幅と高さを取得
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
size = (width, height)

#総フレーム数を取得
frame_count = int(video.get(cv2.CAP_PROP_FRAME_COUNT))

#フレームレート(1フレームの時間単位はミリ秒)の取得
frame_rate = int(video.get(cv2.CAP_PROP_FPS))

# 保存用
fmt = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
writer = cv2.VideoWriter('./result/outtest.mp4', fmt, frame_rate, size)

for i in range(frame_count):
    ret, frame = video.read()
    ### ここに加工処理などを記述する ###
    writer.write(frame)

writer.release()
video.release()
cv2.destroyAllWindows()

print("---end---")

 以上がOpenCVで動画ファイルの読み込みと保存の方法です。

 動画のファイルを1フレームずつ読み込んだあとに、何かしらの処理をしてライターの引数に渡してやれば動画を加工することもできそうです。動画を扱って何か作ってみるのもいいかもですね。


・参考資料