カメラからビデオをキャプチャする
時に,Webカメラのライブ映像をキャプチャしなければならないときがあるでしょう.OpenCVはそのためのシンプルなインターフェースを提供しています.カメラからの映像をキャプチャして,グレースケールに変換して表示してみましょう(私はUSBウェブカメラを使用しています).始めるためのタスクは本当にシンプルです.
ビデオをキャプチャするためにはVideoCapture
オブジェクトを作る必要があります.引数はデバイスのインデックス値かビデオファイルの名前です.デバイスのインデックスはそれぞれのカメラに固有の単なる数字です.通常は一つのカメラが接続されています(私の場合は).二つ目以降のカメラは1ずつ数値を変えれば選択できます.その後,フレームbyフレームでキャプチャできます.ただ,最後にキャプチャをリリースするのを忘れてはいけません.
カメラ映像をグレースケールに変換して表示するプログラム
実行結果
cap.read()
の戻り値はbool(True/False)です.フレームが正しく読み込めていればTrueになります.戻り値でビデオの終わりをチェックすることができます.
時々,capがキャプチャを初期化しない時があります.その場合はコードエラーが表示されます.初期化されているかどうかはcap.isOpend()
メソッドで確認することできます.Trueであれば問題ありません.またはcap.open()
でオブジェクトの示すポインタを開くことができます.
cap.get(propId)
メソッドを使ってビデオの特徴を知ることができます.propIdは0から18の数字で,それぞれの数字はビデオのプロパティを示しています.いくつかの値はcap.set(propId, value)
を使うことで変更できます.Valueには設定したい値を入力します.
例えば,フレームのwidthとheightはcap.get(3)
とcap.get(4)
で調べることができます.
cap.getメソッドで取得したフレームサイズを表示させた実行画面
私の場合デフォルトで640×480になっていました.320×240に変更したいのでret = cap.set(3, 320)とret = cap.set(4,240)を追加します.
変更後の実行画面
もしカメラの映像が真っ暗であったり,エラーが出たときは,他のアプリケーションでカメラを使用していないか確認してください.
ファイルからビデオを再生する
変更はカメラインデックスをビデオファイルの名前にすることだけで,あとはカメラからのキャプチャと同じです.フレームを表示している間は,正しい時間をcv2.waitKey()
で使用してください.低すぎると高速になり,高すぎるとスローになります.通常は25ミリ秒が良いでしょう.
ファイルからビデオを再生するプログラム
実行画面
ffmpegやgstreamerの適切なバージョンを確認してインストールしてください.もっぱらffmpeg/gstreamerの誤ったインストールのために,Video Captureで頭が痛くなるような動作が発生することがあります.
ビデオを保存する
ビデオをキャプチャして,フレームbyフレームで処理したものは保存しておきたいです.画像ならcv2.imwrite()
を使えば非常にシンプルにできることですが,ここでは少し操作が必要です.
ここではVideoWriter
オブジェクトを作成します.出力されるファイルの名前(eg: output.avi)をFourCC
コードを指定します(詳細は次の後で説明します).次にfpsとフレームサイズを入力します.最後はisColor
フラグです.Trueならばエンコーダはカラーのフレームとみなし,それ以外ならばグレースケールのフレームとみなし機能します.
FourCC
はビデオコーデックを指定するための4バイトコードです.利用可能なコードはfourcc.orgで確認できます.利用可能なコーデックはプラットフォームに依存します.
FourCC
コードはMJPGの場合は cv2.VideoWriter_fourcc('M','J','P','G')
あるいは cv2.VideoWriter_fourcc(*'MJPG')
として指定できます.
下のコードではカメラをキャプチャして,垂直方向にすべてのフレームを逆転させ保存しています.
カメラ映像を垂直方向に逆転させて保存するプログラム
実行結果