OpenCVとの戦い、取り込みの高速化&&複数カメラからの入力。

id:nyaxtさんid:inajobさんありがとう!。
彼らからの情報提供で複数カメラ入力&高速化ができました。

そもそもの罠

まず経緯からお話しすると。
OpenCVはそのままだと複数台カメラのキャプチャがうまくいかないらしい。様々なサイトを見て回ったんだけどどうもうまくいかないとの記事ばかりでうまく取れている形跡がない。
そして、OpenCVはキャプチャが重いとの定評もあるらしい。(これは噂)

そこでid:inajobさんに以下の情報をいただきました。
内容としてはキャプチャだけDirectShowで行い、OpenCVで処理するというもの。
http://wikiwiki.jp/masayashi/?OpenCV%2FDirectShow%A4%C7%A5%AD%A5%E3%A5%D7%A5%C1%A5%E3%A4%B7%A4%BF%B2%E8%C1%FC%A4%F2%C9%BD%BC%A8%A4%B9%A4%EB

第一の罠

まず、DirectShow。
自分はインストールしてあったので怒られなかったが、もしstrmbasd.libやstrmbase.libで怒られた場合、これらはDirectShowでカメラを使うためのライブラリであるにも係らず自分でコンパイルする必要がある。
そしてたいていのサイトにはDirectXのSamplesフォルダに入っているとかいてあるが、これが大いなる罠。
DirectShowはDX9のどっかのタイミングでDirectX SDKからはずされMicrosoft Windows SDKに引越しをしている。
なのでMicrosoftWindowsSDKとかで検索をし、最新のものをインストールする必要がある。ちなみにCDイメージでの配布なので、焼くかヴァーチャルドライブで読む。

で、やっとこさDLLのコンパイルなわけですが。フォルダの階層が深い・・・
うちでは以下のフォルダにありました。が、ヴァージョンによってはちがうかも
..\Microsoft SDKs\Windows\v6.0\Samples\Multimedia\DirectShow\BaseClasses

コンパイル前に以下のフォルダをツールのオプションからインクルードパスに追加しておきましょう。
..\Microsoft SDKs\Windows\v6.0\Include
..\Microsoft SDKs\Windows\v6.0\Lib

これでコンパイルできればLIBファイルができるので、それを使います。
っていうか最初からいれとけよ!!!!!mjd

第二の罠

先程のDirectShowからキャプチャをし〜。のサンプルはewclibというヘッダを使っています。
以下作者のページ
http://www.geocities.jp/in_subaru/ewclib/index.html

ですが、先程のサンプルのままで最新のヘッダを使うと所々に問題が起こります。
あれです。仕様変更の罠ってやつです。

エラーが出つつ重要なのは DirectShow.cppの中にあるここ

EWC_Open(MEDIASUBTYPE_RGB24, capture_size_x, capture_size_y, FPS);

最新版ではこれの第一引数が省略され、defineでMEDIASUBTYPE_RGB32に決め打ちがしてあります。なので普通に第一引数を削るだけだと画像が全部二重になり、グレードットが並びます。
これはビット深度の違いなので、一番楽な直し方は
1、第一引数を削る。
2、ewclibの決め打ちされているMEDIASUBTYPE_RGB32をMEDIASUBTYPE_RGB24に打ち直す。
と、いったところです。
まあ、もうちょっとスマートな解決方法もあると思いますが、とりあえずこれで直ります。