PythonでOpenCVを導入すれば簡単にWebカメラを使う事ができます。Webカメラでリアルタイムに映像を取得する方法を学んだら、次はその映像をファイルに保存しましょう。ここでは動画撮影から動画ファイル保存までの方法を紹介します。
こんにちは。wat(@watlablog)です。
webカメラを使いこなすために、ここでは動画撮影から保存までの一連のコードを紹介します!
Webカメラで動画を保存するメリット2選!
①リアルタイム処理だと動作が重くなる時でも後処理で快適になる
Webカメラを使うとPCで動画を撮影することができます。
Pythonで動画を撮影するコードは「Python/OpenCVでWebカメラの情報をリアルタイム表示」で紹介しました。
この記事ではメリットの1つとして、リアルタイム画像処理ができるということを挙げていましたが、PCのスペックによっては処理が重くなり、せっかく高FPSで撮影できるカメラでもコマ落ちしてしまうこともあります。
当ブログでは「Pythonでwebカメラ処理!リアルタイムサリエンシーマップ」でリアルタイム画像処理の例を示しましたが、このようにフレームを取得後に色々画像処理をすればするほど、次のフレーム取得が追い付かなくなることがあります。
処理が重い画像処理をする時は一度動画ファイルに保存して、動画に対して画像処理をする方が断然良いです!
重い処理でも動画ファイルであれば既にFPSは確保されているので、時間さえかければコマ落ちすることなく処理が完了することがメリットの1つですね。
②1つの動画に対し複数の動画処理をする時も後解析で快適になる
例えば一度撮影した動画に動画処理を施した後、その動画を再利用して異なる処理を行う場合、リアルタイム動画処理では同じ映像を得ることはできません。
動画処理プログラムコードの検証を色々する時によくある状況ですね。
こんな時も動画ファイルに保存して動画ファイルに対して処理を行うようにすることで解決します。
動画ファイルを使えば動画の再利用をして処理を行うことができるメリットがあります!
Pythonで動画を撮影して保存するコード
動画撮影方法のコードおさらい
動画を撮影するコードは「Python/OpenCVでWebカメラの情報をリアルタイム表示」で紹介しましたが、今回も基本はこのコードを使うのでおさらいしておきます。
以下が動画撮影のコードの再掲です。cv2.VideoCaptureと.readを使って撮影を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import cv2 camera = cv2.VideoCapture(0) # カメラCh.(ここでは0)を指定 # 撮影=ループ中にフレームを1枚ずつ取得(qキーで撮影終了) while True: ret, frame = camera.read() # フレームを取得 cv2.imshow('camera', frame) # フレームを画面に表示 # キー操作があればwhileループを抜ける if cv2.waitKey(1) & 0xFF == ord('q'): break # 撮影用オブジェクトとウィンドウの解放 camera.release() cv2.destroyAllWindows() |
このコードは「q」キーを打つと撮影終了する仕様です。
では続いてこのコードに動画ファイル保存を追加してみましょう!
動画ファイルを保存する処理を加えて完成
基本の撮影コードを踏まえた上で本題です。
以下のコードが撮影と保存を同時に行うPythonコードです。
上の撮影用コードと見比べて頂けるとわかると思いますが、「# 動画ファイル保存用の設定」というコメントから下5行が保存のための設定です。そして、whileループの中で.writeを使って撮影したフレームを1枚1枚動画として保存します(動画もパラパラ漫画のような仕組みです)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import cv2 camera = cv2.VideoCapture(0) # カメラCh.(ここでは0)を指定 # 動画ファイル保存用の設定 fps = int(camera.get(cv2.CAP_PROP_FPS)) # カメラのFPSを取得 w = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)) # カメラの横幅を取得 h = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)) # カメラの縦幅を取得 fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') # 動画保存時のfourcc設定(mp4用) video = cv2.VideoWriter('video.mp4', fourcc, fps, (w, h)) # 動画の仕様(ファイル名、fourcc, FPS, サイズ) # 撮影=ループ中にフレームを1枚ずつ取得(qキーで撮影終了) while True: ret, frame = camera.read() # フレームを取得 cv2.imshow('camera', frame) # フレームを画面に表示 video.write(frame) # 動画を1フレームずつ保存する # キー操作があればwhileループを抜ける if cv2.waitKey(1) & 0xFF == ord('q'): break # 撮影用オブジェクトとウィンドウの解放 camera.release() cv2.destroyAllWindows() |
このコードを実行するとVideoWriterで設定した「video.mp4」というファイルがプログラム実行フォルダの直下に保存されます。
実行結果
以下のYouTube動画が上記動画撮影と保存を行うプログラムコードの実行例です。何か良い例は無いかと家の中を探したところ、変わったタイプのヤジロベエがあったので、Webカメラで撮影してみました。
30FPSで撮影しており、まあまあな滑らかさかなと思います。ともあれ、動画の撮影と保存を同時に行うことができました。
まとめ
本記事ではWebカメラで動画ファイルを保存することのメリットを2つ紹介しました。
本来リアルタイムで動画処理したい時に処理落ち・コマ落ちしてしまう場合や、同じ動画に対して複数の処理をしたい場合は一度動画ファイルを保存しておいて後処理的に扱えることがメリットです。
また記事の最後では、動画の撮影と保存を同時に行うPythonコードを紹介しました。是非皆様の開発環境で実行して確かめてみて下さい!
動画の撮影と保存のコードは今後も多用しそうだぞ!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!
コメント