BloomScheme Blog

株式会社ブルームスキーム公式ブログ

Windowsで解像度まで指定する簡単なWebCamera制御

f:id:BloomScheme:20190412191401j:plain WebCameraを簡単に制御したい!しかも任意の解像度を使って! というといろいろな方法がすぐ出てくるわけですが、解像度指定が正常に動くものは実は案外少なかったです。

Python + OpenCV

OpenCVのVideoCaptureを使うと大変簡単にWebカメラを制御することができますし、参考になる情報が沢山検索に引っかかります。 が、解像度を指定すると厄介で、基本的にできません。「デバイスがたまたまできるものならできる」という情報が沢山検索に引っかかります。

node.jsにモジュールがあるのでは?

pythonの他に簡単モジュールソリューションといえばnode.jsということで、探してみると

node-webcam - npm このようなものを発見しました。説明を読んでみるとWindows版ではこちら(node-webcam/src/bindings/CommandCam at master · chuckfairy/node-webcam · GitHub)のバイナリを使用して実装してるようです。

こちらのコマンドラインオプションが定義されているコードを読んでみると… node-webcam/CommandCam.cpp at master · chuckfairy/node-webcam · GitHub どうも解像度指定は存在しませんね!? 自分でいじろうとmakefileなど読み込んでみると、どうもMicrosoft Windows SDK 7.0 のDirectShowのサンプルコードなどを参照しているようです。な、なるほど…。 まずサンプルコードを取得するのがだいぶ大変です。そしてDirectX を直接いじるのはだいぶめんどくさい… DirectX 12のこの時代にDirectShowはあまりいじりたくない…

Windows フォームアプリケーション

DirectXをいじるぐらいだったらMFCのフォームアプリとかで簡単にできるクラスがありそうなものでは? ということで出てきたのがこちら(Windows の組み込みカメラ UI を使った写真とビデオのキャプチャ | Microsoft Docs)。 これは光明がさしたかもしれない! としばらくいじっていると参照先が足りません。調べるとどうもこれはWindows Storeアプリとして作らないといけないようで、フォームアプリとして作り始めるといろいろ参照を追加しないとビルドできません。 そして参照を追加してもいろいろエラーが出ます。め、、めんどくさい…!!

やっぱりUnityですね!

最後の最後に気がついたのがUnityですが、これが正解でした!

UnityEngine.WebCamTexture - Unity スクリプトリファレンス

こちらのクラスから簡単に解像度を含めたWebCameraの制御ができました!

詳細な制御はちゃんとがんばりましょう

Unityで大変よい感じだったのですが、入力時点での露出補正等細かい制御等はできないようです。 その場合はDirectXやデバイスのコントロール等を直にさわって制御しなければならなさそうです。 スマホやラップトップなどカメラ搭載デバイスは沢山出回っているので、もっとイージーに扱えるのではないかと思ってしまっていましたが、なかなか大変そうです。