Python OpenCV 動画再生の基礎

まくまく
まくまく
Pythonの画像処理ライブラリOpenCVを用いて動画を再生してみようと思います。

PCのカメラを表示する

まずはノートパソコンの画面上部についているカメラで撮影した動画をOpenCVで表示してみようと思います。

#ライブラリのインポート
import cv2

#VideoCaptureオブジェクトを取得
#コンピュータのカメラは(0)、外部カメラは(1)などを入力
cap = cv2.VideoCapture(0)

#動画の表示
while (cap.isOpened()):
    #フレーム画像の取得
    ret, frame = cap.read()
    #画像の表示
    cv2.imshow("Image", frame)
    #キー入力で終了
    if cv2.waitKey(10) != -1:
        break

cap.release()
cv2.destroyAllWindows()

処理の流れは、VideoCaptureでオブジェクトを取得し、カメラへの接続ができていればimshowで画面にその映像を表示するというものです。

コメントにも書いていますが、コンピューターに付いているカメラを使用する場合は「VideoCapture(0)」、外部カメラなどの場合は「VideoCapture(1)」などを入力します。

AでもBでもEnterでも何らかのキー入力があると動画表示を終了できます。



動画ファイルを読み込み再生する

次はPCのカメラ映像ではなく、動画ファイルを読み込み再生する方法です。

#ライブラリのインポート
import cv2

#VideoCaptureオブジェクトを取得
cap = cv2.VideoCapture("test.mp4")

#動画の表示
while (cap.isOpened()):
    #フレーム画像の取得
    ret, frame = cap.read()
    #画像の表示
    cv2.imshow("Image", frame)
    #キー入力で終了
    if cv2.waitKey(10) != -1:
        break

cap.release()
cv2.destroyAllWindows()

VideoCaptureに直接ファイル名を入力すると、その動画を再生することができます。動画ファイルはプログラムと同じフォルダに保存しておく必要があります。またはディレクトリを入力してもOKです。

動画ファイルのプロパティを表示する

読み込んだ動画ファイルのプロパティを出力してみましょう。

#ライブラリのインポート
import cv2

#VideoCapture オブジェクトを取得
cap = cv2.VideoCapture("test.mp4")

#動画のプロパティを取得
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)
frame_num = cap.get(cv2.CAP_PROP_FRAME_COUNT)
time = frame_num / fps

#動画のプロパティを出力
print("WIDTH:", int(width))
print("HEIGHT:", int(height))
print("FPS:", int(fps))
print("FRAME NUM:", int(frame_num))
print("TIME(sec):", int(time)) 

出力はこちら

WIDTH: 1920
HEIGHT: 1080
FPS: 30
FRAME NUM: 437
TIME(sec): 14

動画ファイルの幅、高さ、フレームレート、フレーム数、時間を出力することができます。

動画を白黒表示にする

読み込んだ動画ファイルを白黒にして表示してみます。

#ライブラリのインポート
import cv2

#VideoCapture オブジェクトを取得
cap = cv2.VideoCapture("test.mp4")

#動画の表示
while (cap.isOpened()):
    #フレーム画像の取得
    ret, frame = cap.read()
    #グレースケールに変換
    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    #画像の表示
    cv2.imshow("Image", frame_gray)
    #キー入力で終了
    if cv2.waitKey(10) != -1:
        break

cap.release()
cv2.destroyAllWindows()

動画に何らかの処理を加える場合は、「ret, frame = cap.read()」と「cv2.imshow(“Image”, frame_gray)」の間にその処理を記載します。今回はグレースケールで動画を白黒にしてみました。動画といっても基本は画像の集合体のため、単体の画像をグレースケール化するのと同様の処理でOKです。

動画をリサイズして再生する

読み込んだ動画をリサイズして表示してみます。

#ライブラリのインポート
import cv2

#パラメーター
size = 10

#VideoCapture オブジェクトを取得
cap = cv2.VideoCapture("test.mp4")

#動画のプロパティを取得
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)

#動画の表示
while (cap.isOpened()):
    #フレーム画像の取得
    ret, frame = cap.read()
    #リサイズを実行
    frame_resized = cv2.resize(frame, (int(int(width)/size), int(int(height)/size)))
    #画像の表示
    cv2.imshow("Image", frame_resized)
    #キー入力で終了
    if cv2.waitKey(10) != -1:
        break

cap.release()
cv2.destroyAllWindows()

グレースケールと同様に「ret, frame = cap.read()」と「cv2.imshow(“Image”, frame_gray)」の間に処理を記載しています。動画の幅と高さを取得して、それらをsizeで割っています。上の例では10分の1のサイズの動画が再生されます。

動画を無限ループ再生する

読み込んだ動画ファイルをループ再生します。

#ライブラリのインポート
import cv2

#VideoCapture オブジェクトを取得
cap = cv2.VideoCapture("test.mp4")


#動画の表示
while (cap.isOpened()):
    #フレーム画像の取得
    ret, frame = cap.read()
    
    #無限ループ、またはキー入力で終了
    if ret:
        #画像の表示
        cv2.imshow("Image", frame)
        if cv2.waitKey(10) != -1:
            break
    else:
        cap.set(cv2.CAP_PROP_POS_FRAMES, 0)

cap.release()
cv2.destroyAllWindows()

動画を読み込み何らかのキーが押されるとBreakで終了、押されなければ無限にループします。

Python OpenCVを用いた動画編集についてはこちらの記事でまとめています。>>>Python OpenCVを用いた動画編集 使い方 まとめ

タイトルとURLをコピーしました