福岡人データサイエンティストの部屋

データサイエンスを極めるため、日々の学習を綴っています。

【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ではじめよう ディープラーニングによる画像認識