OpenCVでの動画の読み込み速度を確認する

HDMI分配器を購入して、ゲーム映像をGPD Pocket3でキャプチャする準備ができたので、さっそく試してみる。

まずはOBS Studioをインストール。
配信する予定は特にないので、録画用の設定で初期設定を行う。

次にデバイスを登録。
OBSを起動→ソース(左下)の+マークをクリック→映像キャプチャデバイス→新規で名前を付けてOKをクリック→デバイスから[HDMI Capture]を選択する
※この時にKVMモジュールにHDMIの映像信号が入力されていないと、デバイスが見つからない。

続いて、保存場所を設定する。
OBSの画面の左下から設定を選択→出力→録画ファイルのパスを変更する。

ついでに動画フォーマットとエンコーダを変更。
OBSの画面の左下から設定を選択→出力→動画フォーマットをmp4に変更する。
同様にエンコーダをソフトウェア(x264)に変更する。

ファイル名にスペースが入ると面倒なので[スペースなしのファイルを生成]にチェックを入れておく。

OBSの設定
変更後のOBSの設定画面

あとはOBSの画面左下の録画開始を押せば録画ができるはず・・・

とりあえずApex Legendsを1マッチを録画してみた。

20分54秒で約1.87GBほどのサイズになった。

続いてこれをOpenCVで読み込んで処理をして時間を計測してみる。

読み込みは単純なループで画面表示ありなし、加えてVisual Studioを使用するので、DebugとReleaseで測定することにする。

import sys
import time
import cv2

path = 'D:\\sample.mp4'
delay = 1
window_name = 'frame'
show = True

cap = cv2.VideoCapture(path)

if not cap.isOpened():
    sys.exit()

# 処理前に時間を取得
start_time = time.process_time()

while True:
    ret, frame = cap.read()
    if ret:
        if show:
            cv2.imshow(window_name, frame)
            if cv2.waitKey(delay) & 0xFF == ord('q'):
                break
    else:
        break

# 処理後に時間を取得
end_time = time.process_time()

# 開始時間と終了時間の差分(秒)
elapsed_time = end_time - start_time
print("elapsed time:", elapsed_time)

if show:
    cv2.destroyWindow(window_name)

実行結果は以下の通りになった。
当たり前ではあるが、思いのほか画面を表示すると遅くなるようだ。

DebugRelease
表示あり1528.0秒1510.203125秒
表示なし1009.8125秒968.671875秒

元の動画が20分54秒=1254秒なので、画面表示をした場合には処理に元の動画の再生時間よりも時間が掛かってしまっていることになる。
ただし、waitKeyはdelayで指定した秒数だけwaitが入るようなのでこの影響である可能性が高い。
今後の処理も考えると、読み込みと画像処理のスレッドを分けてキューイングした方が良さそうだ。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA