【OpenCV】動画の取扱い【Python】
こんにちは!こーたろーです。
OpenCVの第4回目です。
前回までは画像の取扱いの基礎をやってきましたが、次は動画の基礎をやっていきます。
動画の情報は、画像情報とは若干ことなり、画像の時系列の配列+音声データなどもはいいていますので、押さえておきたいです。
それでは早速やっていきましょう。
ライブラリのインポート
ライブラリをインポートします。
sysですが、こちらはインタプリタで使用・管理している変数や、インタプリタの動作に深く関連する関数を定義しているものです。
使いながら説明します。
import cv2 import sys
動画データの取得
動画データは、openCVのVideoCaptureにて呼び出します。
また、呼び出したビデオのデータの有無をisOpen( )メソッドでブーリアンとして確認します。
cap = cv2.VideoCapture("movie/fan.mp4") if cap.isOpened() == False: exit()
動画の表示
動画の表示のベースは以下のようなwhile分を使うといいです。
while True: ret, frame = cap.read() if ret == False: break cv2.imshow("img",frame) if cv2.waitKey(30) == 27: break cv2.destroyAllWindows()
cap.read()で、ret、frameにデータを入れていますが、retは動画データの有無をブーリアンで返すメソッドで、frameは動画の画像情報を取得する配列になっています。
imshowでWindowをポップアップ表示させるのですが、そのときのWindowの名前(タイトル)を第1引数にしています。第2引数に動画データを入れています。
第2引数に動画データを入れています。
waitKey( )メソッドは引数の数字[ミリ秒]だけ、毎に状態を確認します。
このメソッドに対して「27」が与えられると、強制的にif文をbreakします。この「27」は、Windowがアクティブになっているときに「ESC」キーを押した場合に相当します。
つまり、動画表示中でWindowがアクティブ(選択された状態)であれば、Escキーを押せば、if文をbreakして、最後のdestroyAllWindows( )に進み、Windowを閉じるということになります。
動画の書出し
動画の書出しを行います。
動画を書出しする際は、FPS(Frame per Second)やコーデック(圧縮方式)、サイズなどを指定する必要があります。
cap = cv2.VideoCapture("movie/fan.mp4") if cap.isOpened() == False: sys.exit() ret, frame = cap.read() h, w = frame.shape[:2] fourcc = cv2.VideoWriter_fourcc(*"XVID") ##動画の圧縮方式であるコーデックを指定 dst = cv2.VideoWriter("output/test.avi", fourcc, 30.0, (w,h)) while True: ret, frame = cap.read() if ret == False: break cv2.imshow("img", frame) dst.write(frame) if cv2.waitKey(30) == 27: break cv2.destroyAllWindows()
まず、動画をVideoCapture( )メソッドで呼び出します。
その後、データの有無を確認し、ret、frameにデータを引き渡します。
また、出力後の動画サイズと呼び出した動画サイズを同じにするために、元のフレームのデータ(frame)について、shape( )を用いて縦×横の情報を取り出します。
frame.shape( )で取り出される情報は、3次元のタプルのリストになっているため、スライスで縦×横の2次元分を取り出して、h、wとして変数に格納します。
fourccはコーデックを指定する変数になります。
dstは、動画を保存するためのパスやコーデック、FPS、サイズを指定します。
その後、While分で、cap.read()で動画情報を次々に読み込んで、dst.write( )で書き込んでいきます。
これによって、フレームが次々に処理されていき、動画が保存されることになります。
少し処理が細かいので混乱しそうですが、基本の形を覚えておくとよいかもしれません。
ではでは。
OpenCVではじめよう ディープラーニングによる画像認識