PythonのOpenCVを使えば簡単に動画の処理ができることがわかりました。既存の動画を使って処理を練習するのも良いですが、OpenCVはWebカメラにも簡単にアクセスできます。ここではPythonとOpenCVを使ったWebカメラ取り扱い基礎として、カメラの情報をリアルタイムに表示する方法を習得します。
こんにちは。wat(@watlablog)です。
動画処理シリーズもいよいよ撮影を扱います!ここではOpenCVを使ってリアルタイムに動画を画面表示する方法を紹介します!
プログラム的に動画撮影をする2つのメリット
①リアルタイム動画処理ができる
プログラム的に動画を撮影する技術を身に着けるのはどういったメリットがあるのでしょうか?
2019年現在の日本は携帯、スマホ等のモバイル端末の普及率が90%を超えています※。これらの機器を使えば動画を撮影することは容易で、わざわざPython等のプログラム言語を駆使してまで動画を撮影する技術を身に着ける必要性は感じないかも知れません。
しかし、プログラム的に動画を撮影できるようになるという事は、自由に、そしてリアルタイムに動画に処理を加えられるようになるということになります。
例えば、webカメラを設置しておいて、映った人の顔認証をリアルタイムに行うとか、動体トラッキングや画像相関法によるひずみ解析をやるとか…アイデアは多岐に渡りますね。
当WATLABブログでも「Pythonでブログの広告が目立つかどうか「動的」に評価する方法」や「Python動画編集!動画に位置制御したテロップを入れる方法」で動画編集に関するプログラムを紹介していましたが、これらは撮影された動画に対して後処理的に実行していただけです。
動画撮影中にリアルタイムに処理が出来れば、活用の幅もひろがりそうですね。
スマホのカメラ撮影では出来ない処理ができる、これがプログラム的に動画撮影を行う最大のメリットであると言えます。
②他の処理と連動した動画が撮影できる
動画自体に処理はしなくても、メリットはまだあります。
例えばPythonプログラムを使って録音等の実験データ収集を行っていたとしましょう。
実験データ収録のタイミングに合わせて動画や画像を撮影すれば、後で自分でデジカメを使ったサンプルの状態記録をしなくてもよくなります。
このような普段実行しているプログラムと併用させて動画や画像を撮影できるようにしておくと、工程を自動化することができるケースもあります。
動画や画像を取得するプログラムは、それ自体がアイデア次第で様々な可能性を持ちます。
Pythonで動画を撮影してリアルタイムに表示するコード
使用機器
今回のコードにはwebカメラを使います。
webカメラであればPC付属のカメラでも何でも動作すると思いますが、僕は以下のマイクロソフトから出ているwebカメラを使っています。
コード説明
今回のwebカメラを使った撮影プログラムは、以下の画像に示すような動作をします。
カメラはある間隔で「フレーム」を取得します。今回はそのフレームを単純にPCのディスプレイに表示させるだけです。
コードを以下に示します。
まずはカメラオブジェクトcameraを作成していますが、ここでカメラのチャンネル番号を指定しています。
その後whileループを使ってフレームを取得しています。retはフレームを取得できたかどうかをTrueかFalseで示してくれます。
「Python小技!whileループ中のキー操作を受け付ける方法」ではwhileループを中断する方法を紹介しましたが、実はOpenCVはwaitKey関数でキー操作を待つことが出来ます。0xFFで読み取った文字コードがordで指定した番号と一致していればbreak文が実行される仕組みです。
最後にreleaseとdestroyAllWindowsでメモリを開放しています。
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() |
このコードを実行すると画面上にリアルタイムに撮影結果が表示されると思います。
まとめ
本記事では動画をリアルタイムにPC画面に表示させるメリット2つと、そのコードを紹介しました。
このコードは動画撮影と動画処理を行う上で基本となるので、特に凝った処理を行わないで単発の記事としました。
次回より、このコードに肉付けを行って動画処理プログラムを作成してみようと思います。
いよいよ動画撮影プログラムを習得しました!このプログラムを起点に様々な処理へ発展させていきましょう!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!
この記事の最初のほうに、謎のワーニングメッセージがたくさん表示されていますよ。
…!!
しげきさん、教えて頂きありがとうございます!
wordpressプラグインの更新をしていなかったことが原因でした。
感謝です!
カメラのチャンネルを「0」にしていると、PCに内蔵されているカメラになりますが、これを別で購入したWEBカメラにチャンネルを切り替えたい場合はどうしたらよいでしょうか?
なかなか、ネットで方法を探しても見つからず、教えていただけると助かります。
ご訪問ありがとうございます。
PC内臓カメラや外部カメラのチャンネルはPCによって順番が変わってしまうようです。
例えば、2台のカメラを接続しているとして、
cameras = []
for i in range(2):
cameras.append(cv2.VideoCapture(i))
print(cameras)
…とすることで2つのカメラチャンネルをリストで取得することはできます。
ただ、固有の番号というわけでは無いようで、どんな場合でも外部カメラのチャンネルをプログラム的に特定するのは工夫が必要だと思います。。
予め接続してチャンネル番号を把握してから、cv2.VideoCapture(1)とかで外部カメラを使う方法が現実的でしょうか。