動画ファイルの表示(Python を使用)
【概要】
動画ファイルを表示するプログラムの例である。OpenCV の cv2.VideoCapture で動画ファイルを開き、フレーム(動画を構成する1枚1枚の画像)を順に読み込んで表示する。あわせて、幅、高さ、フレームレート(1秒あたりのフレーム数)、再生位置を取得して表示する。動画の終わりまで来たら先頭に戻り、ESC キーで終了する。
【目次】
【関連する外部ページ】
- OpenCV 公式ドキュメント cv::VideoCapture クラス: https://docs.opencv.org/5.0/main_modules/classcv_1_1VideoCapture.html
- OpenCV 公式のチュートリアル Getting Started with Videos: https://docs.opencv.org/5.0/py_tutorials/py_gui/py_video_display/py_video_display.html
- OpenCV 公式のサンプルデータ(vtest.avi を含む): https://github.com/opencv/opencv/tree/master/samples/data
【サイト内の関連情報】
第1章 動作環境と準備
動作環境は Python 3.12、OpenCV 5 とする。
管理者権限でコマンドプロンプトを起動する
(手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。
次のコマンドで OpenCV をインストールする。
pip install -U --no-user opencv-python
表示する動画ファイルとして、OpenCV 公式のサンプル動画 vtest.avi を使う。OpenCV のリポジトリの samples/data から入手し、プログラムと同じディレクトリに置く。別の動画ファイルを使う場合は、プログラム中のファイル名を書き換える。
第2章 動画ファイルを表示する Python プログラム
次のプログラムを実行すると、"VideoFile" という名前のウィンドウに動画が表示される。終了するときは ESC キーを押す。
import cv2
# 動画ファイルを開く
cap = cv2.VideoCapture("vtest.avi")
if not cap.isOpened():
print("動画ファイルを開けなかった")
exit()
# 幅、高さ、フレームレート、総フレーム数の取得
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)
frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
cv2.namedWindow("VideoFile", cv2.WINDOW_AUTOSIZE)
while True:
ret, frame = cap.read()
if not ret:
break
msec = cap.get(cv2.CAP_PROP_POS_MSEC)
index = cap.get(cv2.CAP_PROP_POS_FRAMES)
cv2.imshow("VideoFile", frame)
if cv2.waitKey(int(1000 / fps)) == 27:
# ESC キー
break
print(f"width = {width}, height = {height}, fps = {fps}, index = {index}, msec = {msec}")
# 終わりまで来たら最初に戻る
if index >= frame_count:
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
cap.release()
cv2.destroyAllWindows()
第3章 プログラムの説明
cv2.VideoCapture("vtest.avi"):動画ファイルを開く。cap.isOpened()は、開けたかどうかを返す。cap.get(...):動画の情報を取得する。cv2.CAP_PROP_FRAME_WIDTHは幅、cv2.CAP_PROP_FRAME_HEIGHTは高さ、cv2.CAP_PROP_FPSはフレームレート、cv2.CAP_PROP_FRAME_COUNTは総フレーム数、cv2.CAP_PROP_POS_FRAMESは現在の再生位置(先頭からのフレーム数)、cv2.CAP_PROP_POS_MSECは現在の再生位置(先頭からのミリ秒)である。OpenCV 5 では、使用中のバックエンドが対応していない項目については負の値が返る(OpenCV 4 では 0 が返っていた)。cap.read():1フレームを読み込む。戻り値は、読み込めたかどうか(ret)と、画像データ(frame)の2つである。cv2.namedWindowとcv2.imshow:ウィンドウを作り、そこに画像を表示する。cv2.WINDOW_AUTOSIZEは、画像の大きさに合わせてウィンドウの大きさを決める指定である。cv2.waitKey(ミリ秒):指定したミリ秒だけキー入力を待ち、押されたキーのコードを返す。int(1000 / fps)ミリ秒待つことで、元の動画に近い速さで表示する。戻り値の 27 は ESC キーのコードであり、押されたときに繰り返しを抜ける。cap.set(cv2.CAP_PROP_POS_FRAMES, 0):再生位置を先頭に戻す。再生位置が総フレーム数に達したときに実行することで、繰り返し再生になる。cap.release()とcv2.destroyAllWindows():使い終わった資源を解放し、ウィンドウを閉じる。