«« ブックマークレットPaste Titleで、ブログをちょびっとだけ素早く更新しよう! | RE) 飲み会等で好きなタイプの芸能人を聞かれたら? »»
先日、Visual Basic .NET 2008で構築しているシステムにWebカメラを組み込んでもらえないか?
という話になり、早速組み込んでみようとしたのですが、思いの外悪戦苦闘したのでメモ。
VB2008から、Webカメラを組み込むのは(初めてな人は)、なんて面倒なんだ!
(最新のVisualStudio2010では、もしかすると改善されているのかもしれないけど)。
1.VBはどこかのシリアルポート等とは違って、Webカメラは標準コンポーネントには含まれていない。
2.Windowsの標準的なAPIにも、Webカメラをアクセスする命令はないみたい。
3.でもDirectXのDirectShowから呼び出す事は可能。
その為、Webカメラアプリケーション開発者は事前にDirectXSDKをインストールする必要がある。
・・・というのはGeekなぺーじ : DirectShowプログラミング [VC++]によると昔の話で、2005年4月以降DirectShowはPlatform SDKに移行したらしい。
そのPlatform SDKですが、VS2008インストールでVC/PlatformSDKが存在しない - MSDN:VisualStudioフォーラムによると、VisualStudio2008では、Windows SDK6.0Aのサブセットがインストールされているので、そちらを使って開発していくものらしいです。
4.そのWindows SDK6.0AのサブセットにあるDirectShowですが、C#及びVBからのアクセスは整備されていないらしいです。
そこで、自分が根性で整備するか、もしくは外部のライブラリ(DLL)やモジュールを使用する必要があるとのこと。
ちなみに、根性で整備するのは、初期化するだけでも相当なコードと理解力が必要なようで、挫折。
5.そこで私が選んだのが「DirectShow関係 - M.Oshikiri's HomePage」で、紹介されている「3.2 サンプルグラバによる静止画取得」
ホームページに『ソースは自由に流用して頂いて結構です。』と記載されているので、遠慮なく解析させてもらいましょう。日本語万歳!ありがとう!!
なお、DirectShowDefine.vbとDirectShowUtility.vbは、どちらもDirectShowにアクセスする為のモジュールなので、ここにアクセスしている関連ファイル(FrmView.vbとFrmImage.vbあたり)を中心にアクセス方法を調べていくのが吉。
ちなみに、DirectShowLibやDShowNETというフリーDLLを使って開発していくのもいいらしいですが、私のVB2008からでは、なぜか"指定されたキャストは有効ではありません。"とかいう例外が発生しまくって、終電後自分のアパートで枕を涙で濡らすはめに。なんで動かへんねん!
6.で、肝心のプログラムの流れですが、以下のような流れらしい。
■グラフの初期化
↓
■デバイス(Webカメラ)の認識
↓
■グラフの作成
サンプルグラバフィルタの生成・設定
↓
サンプルグラバをグラフに追加
↓
サンプリング開始
↓
■取得できた画像の出力先をpictureboxに割り当てて再生
↓
■(終了時)グラフの解放
7.6番の中にいくつかDirectShow専門用語がでてきますが、その意味は大体以下の通り。
○グラフ
次の項目で説明しているフィルタの集合体を指します。
○フィルタ
DirectShowでは、Webカメラからの画像を、様々な処理を経由して一般に扱えるようになるのですが、その途中の処理の一つ一つをフィルタというそうです。
フィルタの例
ソースフィルタ・・・Webカメラからデータを取得する
変換フィルタ・・・圧縮やエフェクトを行う
レンダラフィルタ・・・ディスプレイやファイルに出力する
○サンプルグラバ
取得した画像を無加工で出力する、ベーシックなグラフ
ってな感じに理解した。間違っていたらご指摘ください。
で、未経験だと解説ページの言っている意味やサンプルコードの意味不明な例外の山でなかなか理解が進まなかった。
初めてカメラの映像が自分のコードで動き出した時には、殆どM.Oshikiriさんのコードを模写していたとはいえ、ちょっと感激!
とはいえ、もう少しなんとか優しくしてもらえないことか。
■広告
■修正履歴
2020/03/07 Flash部分とお知らせを削除、広告『VisualBasic2019パーフェクトマスター (Perfect Master)』を追加
2010/11/21 初稿掲載
投稿者 kuze : 2010年11月21日 01:10
«« ブックマークレットPaste Titleで、ブログをちょびっとだけ素早く更新しよう! | RE) 飲み会等で好きなタイプの芸能人を聞かれたら? »»
コメント