PythonとOpenCVで動画を保存する方法|動画保存がうまくいかない時の対処法
PythonとOpenCVで動画を保存する基本
PythonとOpenCVを使うと、カメラからキャプチャした映像や処理後の画像を動画として保存できます。
まずは、この基本的な流れを理解しましょう。
OpenCVのインストール
PythonでOpenCVを使うためには、まずOpenCVライブラリをインストールする必要があります。
pip install opencv-python
このコマンドでOpenCVをインストールできます。
動画を保存するPythonコード
次に、簡単なPythonコードを書いてみましょう。
import cv2
# カメラを初期化
cap = cv2.VideoCapture(0)
# 動画保存の設定
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret:
# フレームを保存
out.write(frame)
# 表示
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# 開放する
cap.release()
out.release()
cv2.destroyAllWindows()
このプログラムを実行すると、カメラでキャプチャした映像が保存されます。
コードの解説
VideoCaptureを使うと、カメラや動画ファイルから映像を取得できます。
VideoWriterは動画ファイルの出力に使われます。このとき、fourccでコーデックを指定します。
メインループでは、カメラからのフレームを順に取り出し、writeメソッドで動画として保存します。
動画保存ができないときの対処法
動画保存がうまくいかない場合、いくつかの原因が考えられます。
以下に一般的な原因と対策を挙げます。
カメラデバイスの問題
カメラが正常に動作しているか確認してください。特に、他のアプリケーションがカメラを使用している場合、OpenCVから利用できないことがあります。
ファイルパス
保存先のディレクトリにアクセス権限があるか、指定したパスが有効かを確認します。不正なパスは保存の失敗につながります。
コーデックの問題
指定したfourccコーデックが正しく設定されているか確認しましょう。異なるコーデックを試すことも問題解決につながります。
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
コマンドを使ったデバッグ方法
動画保存できない場合、OpenCVのバージョンやインストール状況も関係します。
以下のコマンドで情報を確認してみましょう。
python -m pip show opencv-python
これにより、インストールされているOpenCVのバージョンとパスを確認できます。
練習問題
問題:
次のPythonコードを参考に、自分のカメラから映像をキャプチャし、5秒間だけ動画として保存してみてください。保存するファイルの名前は「sample_video.avi」とします。
import cv2
cap = cv2.VideoCapture(キャプチャデバイス番号)
fourcc = cv2.VideoWriter_fourcc(*'使用コーデック')
out = cv2.VideoWriter('ファイル名.形式', fourcc, フレームレート, (幅, 高さ))
while(x秒—タイマで測る等):
ret, frame = cap.read()
if ret:
out.write(frame)
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
解答と解説
解答:
import cv2
import time
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('sample_video.avi', fourcc, 20.0, (640, 480))
start_time = time.time()
while (time.time() - start_time) < 5:
ret, frame = cap.read()
if ret:
out.write(frame)
cap.release()
out.release()
cv2.destroyAllWindows()
解説:
cv2.VideoCapture(0)で、デフォルトのカメラデバイスを開きます。
cv2.VideoWriter_fourcc(*’XVID’)でXVIDコーデックを設定しました。これは一般的に使われるコーデックの一つです。
time.time()を使ってコードの開始からの経過時間を計測し、5秒間だけループを回しています。x秒で止める仕組みを簡単に実装できます。
プログラムの最後に、cap.release()とout.release()でカメラとファイルを解放し、cv2.destroyAllWindows()で開いているウィンドウを閉じます。
設定した秒数を満たす前にループが終了することがないよう、start_timeからの差を比較している所がポイントです。