[C/C++/Windows] カメラ デバイスの画像をキャプチャする

Posted by
ぴろり
Posted at
2015/01/28 19:25
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
開発メモ カテゴリ
カバーイメージ

 Windows ネイティブ アプリケーションにおいて、USB 接続のカメラなどから画像をキャプチャして、ピクセルデータを取得するためのメモ。

この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  

背景

 以前に作った CUDGlass を久々に起動してみたところ、USB カメラを画像ソースにするキャプチャ機能が動作しなくなっていましたsad.gif …さすがにもう 10 年前のシロモノなので、画像処理関係が大幅に変わってしまっている様子ですが、検索してみたところやたら COM バリバリのサンプル コードばかりで、理解するのが大変でした。
 ひとまず、USB 接続のカメラからキャプチャした画像をビットマップ形式でファイル保存するところまで進めたので、そこに至るまでのステップを覚書きとして公開します。

ソースコード

 上から順にコードを付け足していったので、差分を見て頂ければ、何がどう変わったのか追いかけやすいと思います。

01. EnumDevice
 接続されたビデオ入力デバイスを列挙するところまでで、スタートが「COM ってなんじゃらホイ?」からだったので練習も兼ねて。
 System Device Enumerator を取得して、VideoInputDeviceCategory カテゴリの列挙子を取得して、そこからモニカを列挙する、という手順になります。更に、取得したモニカからデバイス名を取得するには、BindToStorage でオブジェクトが格納されているストレージへのインターフェイス ポインタを取得して、名前が VARIANT 型のために printf 一発で済まないだとか。まぁ、慣れるまでは(今でも)よく判りません。CoCreateInstance などで生成したインスタンスは、使わなくなったら忘れずに Release しましょう。
02. Capture
 一つ目に列挙されたデバイスから画像をキャプチャして、ウィンドゥに表示するところまで。試しに複数台の USB カメラを接続して試してみましたが動いているよ うです。またここで新しい概念(?)が登場しており、動画や音声は「フィルタ グラフ」で管理するということ。「フィルタ」とは、入力・出力ピンを持つブロックのようなもので、画像を取り込むカメラ「フィルタ」の出力ピンを、画面に出力するキャプチャ「フィルタ」の入力ピンに繋いでやる、という感じです。動画が MPEG ストリームなどであれば、途中に動画をデコードする変換「フィルタ」を挟んでやることになります。でもって、これら複数の「フィルタ」の繋がりを管理しているのが「フィルタ グラフ」ということでしょうか?
 カメラ デバイスのモニカをフィルタに BindToObject して、フィルタ グラフ(CLSID_FilterGraph) を作って、フィルタ グラフにフィルタを AddFilter して…、とまぁ大変です。その後、キャプチャ グラフだとか、IAMStreamConfig だとか出てきてしっかり理解できておらず、参考にしたサンプル コードそのままだったりします。
03. SaveBitmap
 キャプチャした画像のビットマップを得るには、Sample Grabber Filterを利用するとのこと。Sample Grabber Filter とは、入力ピンからのデータ(サンプル)をそのまま出力ピンに渡す変換フィルタで、これをカメラとキャプチャ表示ウィンドゥの間に差し込んでやると、そこを流れるデータを横取りできるようになるわけです。CoCreateInstance で Sampling 用のフィルタを生成して、フィルタの画像フォーマットを設定してから、フィルタ グラフに追加します。これらのフィルタをどのように、どんな順番で接続するのか明示はしていませんが、そのあたりは CaptureGraphBuilder2 が良しなにやってくれるとのこと。
 pSampleGrabber->GetCurrentBuffer で画像データを取得できるので、その後、BITMAPFILEHEADER 構造体などを適切に設定してから、確認のためにビットマップ画像ファイルとして書き出しています。

いろいろ

  • Windows 7 Ultimate (64bit)、Microsoft Visual C++ 2010 Express で動作確認済み。
  • HARD OFF で買ってきたジャンクの PlayStation2 用 USB カメラ EyeToy で動作確認済み。
この記事を Delicious に追加する   このエントリーをはてなブックマークに追加  


この記事を読んだ人はこんな記事も読んでいます記事リコメンデーションについて

カバー画像:色弱・色盲の方の視界をシミュレートする:CUDGlass

関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。