OpenCVを使ったPythonの画像処理について、これまでは静止画の画像ファイルを扱ってきましたが、ここからは映像の処理も扱っていきます。機械学習などで動画での認証などにも利用することになる分野でもあるので興味深いところです。基本的な操作をしっかり学んでいきたいと思います。
ここではMacBook Proに内臓されているwebカメラを利用しての作業になります。USBで接続したwebカメラでも通常なら何も問題なく動くはずです。
OpenCVでカメラに接続する
では、カメラに接続するコードを書いていきましょう。
これまで同様にjupyter notebookを使ってもいいのですが、終了時にカーネルが止まるのではないかと思います。その時はセル全体を再読み込みする必要があります。また、コードは1つのセルに入力する必要があります。
ここでは、jupyter notebookではなく、テキストエディタを使ってコードを書いていこうと思います。
順番にコードを書いてみます。(最後にまとめたコードを示します。)
import cv2
まず、ライブラリをインポートします。
cap = cv2.VideoCapture(0)
VideoCapture()でカメラに接続してオブジェクトを生成します。カメラが1台だけ接続された環境なのでデフォルトでは0と指定します。複数あれば、数値を変えて指定します。
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
ビデオの映像の幅と高さを自動的に取得しています。データはfloat型で返されるので、intでキャストしています。
while True:
ret,frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
while文を使って、カメラでのキャプチャーを実行して行きます。read()で読み込みます。retでture/false、frameで映像のパラメータを取得しています。
cvtColor()でframeの映像を、COLOR_BGR2GRAYでグレースケールの映像にここでは変換してみます。
imshow()で映像をグレースケールで表示します。
if文を使って、cv2.waitKey(1) & 0xFF == ord(‘q’)のとき、つまり1ミリ秒キーイベントを待ち、[q]キーが押されたらbreakして終了させます。ウインドウの閉じるボタンなどでは終了させることができません。
このあたりの処理はマウスを使った直接描画でも行いました。
ord(‘q’)の代わりに27を指定すると[esc]キーで終了できます。
cap.release()
cv2.destroyAllWindows()
最後に、release()でデバイスを解放して終了させます。destroyAllWindows()でウインドウを破棄して操作は終了です。
ここまでのコードを1つにまとめると次のようになります。
import cv2
cap = cv2.VideoCapture(0)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
while True:
ret,frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
これを適当なファイル名で保存して、ターミナルからこのPythonコードを実行してみましょう。
すると、カメラが起動して画面にグレースケールで撮影された映像が表示されるはずです。
[q]キーを押せば、カメラを終了することができます。
動画ファイルとして書き出す
これで、カメラを起動し撮影することができるようになりました。
でも、このままではストリーム表示されているだけですので、今度は撮影した動画をファイルに書き出して録画するようにしてみましょう。
import cv2
cap = cv2.VideoCapture(0)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
ここまでは、これまでと同じです。
writer = cv2.VideoWriter('images/capture.mp4', cv2.VideoWriter_fourcc(*'mp4v'),25, (width, height))
VideoWriter()で動画ファイルに書き込んで行きます。
まず書き出すファイル名を指定します。ここではimagesフォルダの中にcapture.mp4で保存します。
次にコーデックを指定する関数VideoWriter_fourcc()を指定し、ここではコーデック名は*’mp4v’を指定しておきます。VideoWriter_fourcc(‘m’, ‘p’, ‘4’, ‘v’)と書いてもいいです。このコーデック名はプラットフォームにも依存するようです。WINDOWSでは「*’VIDX’」を指定、Macやその他は「*’XVID’」を指定するというような記述がネットなどにありますが、この時、ファイルの拡張子が「.mp4」でも出力できますが環境変数が足りないというような表示が出たりします。「.avi」にするなどこのあたりは機種にコーデックの対応を色々試してみる必要があるかもしれません。
次に動画のフレームレート(=1秒あたりのフレーム数)を指定しています。ここでは25fpsにしました。ちなみに一般的な動画を作成する場合は30fpsくらいで十分ですが、動きを滑らかに見せたい場合は60fpsでいいでしょう。ここを大きくしていくとより滑らかになりますが、同じ長さの動画でもファイルの容量が大きくなりますので注意が必要です。
最後に動画の縦と横のサイズを指定しています。カラー動画で書き出すので、最後にisColor=true を付け加えても構いません。
while True:
ret, frame = cap.read()
writer.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
while文で実行します。ほとんど先ほどと同じですが同じですが、グレースケールに変換する代わりにwriter.write()でframeを書き出しています。
あとはframeを動画で表示して、前と同様に終了キーの設定をしています。
cap.release()
writer.release()
cv2.destroyAllWindows()
最後にデバイスを解放し、書き込みを終了して、ウインドウを閉じる処理で完了です。
コードを1つにまとめると次のようになります。
import cv2
cap = cv2.VideoCapture(0)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
writer = cv2.VideoWriter('images/capture.mov', cv2.VideoWriter_fourcc(*'mp4v'),25, (width, height))
while True:
ret, frame = cap.read()
writer.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
writer.release()
cv2.destroyAllWindows()
これをPtyhonファイルで保存して、ターミナルから実行してみましょう。
カメラが起動し、撮影が始まります。[q]キーを押して、保存先のフォルダを覗いてみると、動画ファイルが作成されているはずです。
最後に
ここでは、OpenCVを使ったPythonの画像処理について、映像を今後扱っていく為にwebカメラの接続を行ってみました。
USBのwebカメラでもPCにビルトインされたカメラでも何も細かい設定をすることなしに、OpenCVを使えば基本的に操作することができます。VideoCapture()を使ってカメラにアクセスします。
動画の保存にはVideoWriter()を使います。この時、コーデックをVideoWriter_fourcc()で指定します。機器にあったものを指定しましょう。
保存された動画をプレーヤーで再生して見ると、ちょっと早送りで再生されますがこれはコンピューターの処理速度の影響によるものです。これは動画の再生時に調整をすることになりますが、これは次の投稿で扱います。