![]() |
OpenCV 4.13.0
Open Source Computer Vision
|
しばしば、カメラでライブ映像をキャプチャしなければならない。OpenCVはこれを行うための非常にシンプルなインタフェースを提供する。カメラから動画をキャプチャし(私はノートPCの内蔵ウェブカメラを使っている)、それをグレースケール動画に変換して表示してみよう。手始めにちょうどよい簡単な作業である。
動画をキャプチャするには、VideoCaptureオブジェクトを作成する必要がある。その引数はデバイスのインデックスか動画ファイルの名前のいずれかである。デバイスインデックスは、どのカメラを指定するかを示す単なる番号である。通常はカメラが1台接続されている(私の場合のように)。そこで単純に0(または-1)を渡す。1を渡せば2台目のカメラを選択でき、以降同様である。その後、フレームごとにキャプチャできる。ただし最後に、キャプチャの解放を忘れないこと。
cap.read()はブール値(True/False)を返す。フレームが正しく読み込まれればTrueになる。したがって、この戻り値を確認することで動画の終端をチェックできる。
ときに、capがキャプチャを初期化できていないことがある。その場合、このコードはエラーを表示する。初期化されているかどうかはcap.isOpened()メソッドで確認できる。Trueなら問題ない。そうでなければcap.open()を使って開く。
cap.get(propId)メソッドを使って、この動画のいくつかの特性にアクセスすることもできる。ここでpropIdは0から18までの番号である。各番号は動画の特性を表す(その動画に適用可能な場合)。詳細はここで確認できる: cv::VideoCapture::get()。これらの値の一部はcap.set(propId, value)を使って変更できる。valueは設定したい新しい値である。
例えば、フレームの幅と高さはcap.get(cv.CAP_PROP_FRAME_WIDTH)とcap.get(cv.CAP_PROP_FRAME_HEIGHT)で確認できる。デフォルトでは640x480になる。しかしこれを320x240に変更したい。ret = cap.set(cv.CAP_PROP_FRAME_WIDTH,320)とret = cap.set(cv.CAP_PROP_FRAME_HEIGHT,240)を使えばよい。
ファイルから動画を再生するのは、カメラからキャプチャするのと同じで、カメラのインデックスを動画ファイル名に変えるだけである。また、フレームを表示する際にはcv.waitKey()に適切な時間を指定する。短すぎると動画が非常に速くなり、大きすぎると動画が遅くなる(まあ、これはスローモーションで動画を表示する方法でもある)。通常の場合は25ミリ秒で問題ない。
さて、動画をキャプチャしてフレームごとに処理し、その動画を保存したいとする。画像の場合は非常に簡単で、cv.imwrite()を使うだけである。ここでは、もう少し作業が必要である。
今回はVideoWriterオブジェクトを作成する。出力ファイル名(例: output.avi)を指定する必要がある。次にFourCCコード(詳細は次の段落)を指定する。続いて1秒あたりのフレーム数(fps)とフレームサイズを渡す。そして最後はisColorフラグである。Trueの場合、エンコーダはカラーフレームを期待し、そうでなければグレースケールフレームを扱う。
FourCCは、動画コーデックを指定するために使われる4バイトのコードである。利用可能なコードの一覧はfourcc.orgで見つかる。これはプラットフォーム依存である。次のコーデックは私の環境で問題なく動作する。
FourCCコードは、MJPGの場合 ‘cv.VideoWriter_fourcc('M’,'J','P','G')または cv.VideoWriter_fourcc(*'MJPG')` のように渡す。
以下のコードは、カメラからキャプチャし、各フレームを垂直方向に反転して、動画を保存する。