動画保存時の途中停止と再開方法
概要
動画の保存中に一時停止は、特定のシーンのみを記録したい場合や、不要な部分を省くために使用します。例えば、監視カメラの映像を保存する際に、動きが検出された時だけ記録を行いたいといった場合に有用です。また、ユーザーが手動で一時停止や再開を行いたい場合にも利用できます。この機能により、記録する映像の内容をより細かくコントロールすることが可能になります。
出力結果
プログラム全体
#解説1
import cv2
#解説2
# UVCカメラを開く
cap = cv2.VideoCapture(0)
#解説3
# フレームレートを設定
fps = 30
# ビデオライターを作成
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (640, 480))
#解説4
# ビデオの再生/一時停止の状態を管理するフラグ
pause = False
while(cap.isOpened()):
# pauseがFalseの時だけフレームを読み込み、書き込み、表示する
if not pause:
ret, frame = cap.read()
if ret==True:
out.write(frame)
cv2.imshow('frame',frame)
key = cv2.waitKey(1) & 0xFF
#'q'キーが押された場合、ループを抜けフレームの読み込み・表示を終了し録画停止します。
if key == ord('q'):
break
#'p'キーが押された場合、一時停止のフラグを反転させます。これにより、フレームの読み込みと表示が一時停止したり、再開したりします。
elif key == ord('p'):
pause = not pause
#解説5
# カメラとビデオライターを解放
cap.release()
out.release()
cv2.destroyAllWindows()
解説
解説1: モジュールのインポート
import cv2
OpenCVは、画像処理やコンピュータビジョンのためのオープンソースライブラリです。これを使うことで、画像の読み込み、変換、保存等、画像処理に関連する多くの機能を利用することができます。
解説2: カメラの準備
cap = cv2.VideoCapture(0)
ここでは、UVCカメラを開いて、その映像を取得するためのオブジェクトを作成しています。cv2.VideoCapture(0)
という関数は、引数にUVCカメラのIDを取り、そのカメラにアクセスするためのVideoCapture
オブジェクトを返しています。ここでの0
は、通常はシステムに接続されているデフォルトのカメラ(通常は内蔵カメラ)を指しますが、使用しているカメラによって割り振られる番号が異なりますのでご注意ください。
補足:OpenCVにおけるデバイスID
デバイスが複数接続された場合、このIDは、いつも同じとは限りません。デバイスの起動やシステムへの接続順によって変わることがほとんどです。
TheImagingSource社が提供しているSDK(ICImagingControl)ではカメラ本体にシリアル番号が割り振られており、カメラ毎に設定が容易にできます。詳細は下記をご覧ください。
https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/Python_34/open-with-built-in-dialog.html
解説3: ビデオライターの準備
fps = 30
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (640, 480))
この部分では、ビデオライターを作成しています。ビデオライターは、読み込んだフレームを指定したフォーマットとフレームレートで動画ファイルとして保存するためのものです。cv2.VideoWriter_fourcc(*'mp4v')
で、動画ファイルのコーデックを指定しています。cv2.VideoWriter
の引数にはそれぞれ、出力ファイル名、コーデック、フレームレート、フレームサイズを指定します。
解説4: フレームの読み込みと保存
pause = False
while(cap.isOpened()):
if not pause:
ret, frame = cap.read()
if ret==True:
out.write(frame)
cv2.imshow('frame',frame)
key = cv2.waitKey(1) & 0xFF
#'q'キーが押された場合、ループを抜けフレームの読み込み・表示を終了し録画停止します。
if key == ord('q'):
break
#'p'キーが押された場合、一時停止のフラグを反転させます。これにより、フレームの読み込みと表示が一時停止したり、再開したりします。
elif key == ord('p'):
pause = not pause
ここでは、カメラからフレームを読み込み、それをビデオライターで書き込み、画面に表示するという処理を行っています。具体的には以下のような処理を行っています。
まず、pause = False
で、一時停止のフラグを初期化しています。このフラグがTrueのとき、フレームの読み込みと表示が一時停止し、次にwhile(cap.isOpened()):
で、カメラが開いている間、ループを続けます。カメラが正常に開けなかった場合や、途中で何らかの理由でカメラが閉じられた場合は、このループは実行されません。
if not pause:
で、一時停止のフラグpause
がFalseのとき、つまり一時停止が解除されているときに、フレームの読み込みと表示に進みます。
ret, frame = cap.read()
では、カメラからフレームを1枚読み込みます。ret
は読み込みが成功したかどうかを示すブール値で、frame
は読み込んだフレームのデータです。
if ret==True:
で、フレームの読み込みが成功したときに、フレームの書き込みと表示を行います。
out.write(frame)
で、読み込んだフレームをビデオライターに書き込みます。これにより、フレームは動画ファイルとして保存されます。
cv2.imshow('frame',frame)
で、読み込んだフレームを画面に表示します。
key = cv2.waitKey(1) & 0xFF
で、キーボードの入力を1ミリ秒待ちます。入力があった場合、そのキーコードをkey
に格納します。
if key == ord('q'):
で、q
キーが押された場合、ループを抜けフレームの読み込み・表示を終了し録画停止し、elif key == ord('p'):
で、p
キーが押された場合は、一時停止のフラグを反転させます。これにより、フレームの読み込みと表示が一時停止したり、再開したりします。
解説5: リソースの解放
cap.release()
out.release()
cv2.destroyAllWindows()
最後に、カメラデバイスとビデオライターを解放し、OpenCVのウィンドウを閉じています。これらのリソースは、プログラムが終了するときに必ず解放する必要があります。これを怠ると、リソースが不足したり、次回プログラムを実行するときに問題が生じる可能性があります。
補足:産業用UVCカメラで動画保存
TheImagingSource社のカメラのSDK(ICImagingControl)を使用すると様々な種類のカメラ(USB、GigEなど)から直接ビデオデータを受け取り、そのデータをさまざまなメディアコンテナ(AVI、MP4など)とコーデック(H.264など)に対応して保存することができます。また、下記のように専門的な知識を使うことなくリアルタイムの画像処理と録画を一緒に行うことができます。
https://www.argocorp.com/software/sdk/ICImagingControl/Sample_program/dotnet_35/multiprocessing/6Realtime_Imageprocess_and_save_an_Image_with_LiveDisplay_and_Recording.html