[Python]OpenCVで動画のフレームを画像で保存する方法:コピペOK

Python プログラミング

こんにちは。kakeです。

今回は、Pythonの備忘録的な記事になります。

パソコン触る人

Python書く人「OpenCVを使って動画を読み込み、全フレームを画像として保存したい!」

こういったテーマで解説していきます。OpenCVを使う人は覚えておいて損はないです。また、動画の解析を行うような人はこういったことをすると思いますし、大学生の研究などでも使うかもですね。実際に、僕は大学の研究で必要だったので、学習しました。

スポンサードサーチ

[Python]OpenCVで動画のフレームを画像で保存する方法:コピペOK

[Python]OpenCVで動画のフレームを画像で保存する方法:コピペOK
さて、それでは早速解説していきたいと思います。まずは、ゴールを確認しておきましょう。

今回のゴール

動画をOpenCVで読み込み、全フレームを画像として保存する。

実際に、その様子をみてみましょう。
>>テスト動画
このように、新しいディレクトリを作って、そこに全フレームを保存していきます。(フレーム画像の枚数は279でした、これの出し方は後に解説してあります。)
 
ちなみに、使った動画はMacBookのキーボードを撮っただけの動画です。

手順を把握しよう

それでは、今回の手順をざっと確認していきましょう。

手順

  • ライブラリのimport
  • 保存用のディレクトリを作成
  • 動画を読み込む
  • フレームをループで作成したディレクトリに保存していく

ざっと流れはこんな感じです。単純です。

Pythonのコードを解説していきます:コピペOK

コードを解説していきます。コピペもOKです。ただし、ファイル名などは変えないと動かないですよ。
まず、今回しようしたコードは下記の通りです。

使用したPythonのコード

import os
import cv2

#保存ディレクトリ作成
os.mkdir('./保存ディレクトリ')

cap = cv2.VideoCapture('テスト.MOV')
number = len(str(int(cap.get(cv2.CAP_PROP_FRAME_COUNT))))

#初期値設定
n = 0

#ループを回す
while True:
    ret, frame = cap.read()
    if ret:
        cv2.imwrite('./保存ディレクトリ/{}.jpg'.format(str(n).zfill(number)), frame)
        n += 1
    else:
        break

cv2.VideoCapture()

cv2.VideoCapture()で引数に動画ファイル名を指定して、動画を読み込むことができます。今回の例は、動画ファイルがPythonファイルと同じ階層にあるので、名前だけになっていますが、そうでない場合はファイルパスを指定してください。

cap.get(cv2.CAP_PROP_FRAME_COUNT)

cap.get(cv2.CAP_PROP_FRAME_COUNT)でフレームの数がわかります。そして、その後ですが、int()で整数に直し、str()で文字列に変換して、最後にlen()で何桁あるのかをnumberという変数に返しました。

Pythonコード
何桁あるかを知る理由としては、画像を保存するときのファイル名で使いたいからです。

ret, frame = cap.read()

cap.read()でフレームを読み込めているかどうかをTrue/Falseで返すbool値と、フレーム画像の配列を返してきます。

cv2.imwrite()

最後にフレーム画像の読み込みです。保存のファイル名は連番の数字にします。ということでstr(n).zfill(number)をformatで指定します。

zfill(数字)はその数字分桁数用意して、右詰めで記述するというものです。つまり例えば、zfill(4)だったら0000というように四桁用意されます。あとはstr(n)をくっつければ、nという数字が右詰めで配置されます。

(参考記事):Python, OpenCVで動画ファイルからフレームを切り出して保存 note.nkmk.me

人気記事 実績のあるメンズ・ヒゲ脱毛のおすすめ3選[無料カウンセリングあり]

人気記事 [便利]Apple Watchシリーズ3を今さら買ってみた[コスパが良い]