2014年5月31日土曜日

DirectShowによるUSBカメラのリアルタイム画像処理

前回の記事から随分と経ったが、
OpenCLと組み合わせて処理させるため、

"必要に迫られて"  (←ここ重要)

プログラムの整理と、バグの修正をしたので、アップしておく。

MD5 | ff88eead0158e012f0ea8942b2585ea0 | 12.0 MB | 画像処理
http://ux.getuploader.com/ADMIS/download/43/Image_Processing_Ver03.00_00.zip

しかし、windowsプログラムの書き方が下手くそなせいで、
アクセス違反を回避するためにフラグを立てまくっているのは改善の余地がある。

……どうしたらいいんだ……。

以下、改善案のメモ

如何にしてフラグを使わないで済むようにするか。

<<STEP1.>>

ウィンドウプロシージャを差し替える

ウィンドウプロシージャを差し替える」でGoogle検索
http://wisdom.sakura.ne.jp/system/winapi/win32/win64.html
http://0xc000013a.blog96.fc2.com/blog-entry-179.html←まさにこの問題だった。


<<STEP2.>>

DirectShowのイベントを取得して処理する。

イベントの取得方法
http://msdn.microsoft.com/ja-jp/library/cc370589.aspx
イベントの一覧
http://msdn.microsoft.com/ja-jp/library/cc354475.aspx
……しかし、イベントの一覧を見た所、
DirectShowの初期化完了を知らせるメッセージは無い?
(見逃したのか、本当にないのか……)



たぶん<<STEP1.>>は何とかなる。
問題は<<STEP2.>>だ。


[2014_05_31]追記
<<STEP1.>>は上手くいった。
残るは<<STEP2.>>なのだが、果たして……。

と思って(ネット)サーフィンをしていると、それらしい情報を発見
http://tarodev.web.fc2.com/dshow.html

……やってみた結果、結局の所、

IMediaEvent* pEvent = NULL;
CAM->hr = CAM->pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

// 完了するまで待機する。
long evCode;
// pEvent->WaitForCompletion(INFINITE, &evCode);
pEvent->WaitForCompletion(1000*1000, &evCode);
pEvent->Release();

としても、取得できるイベント

http://msdn.microsoft.com/ja-jp/library/cc356959.aspxより、
このメソッドは、タイムアウトが時間切れになるか、
次のイベントの 1 つが起こるまで動作を停止する。
EC_COMPLETE
EC_ERRORABORT
EC_USERABORT

の内のどのイベントも、USBカメラの初期化完了(キャプチャの実際の開始タイミング)を
教えてくれる訳ではないので、使えない。(取得できるのは上記のURLのイベントリストだけ。)


↓↓↓


結局、WindProcと同じで、クラスごと入れ替える事で一応の解決を図った。
で、その結果。

MD5 | f1905481a82ef3da0e60d3e5083b1d09 | 11.9 MB | 画像処理
http://ux.getuploader.com/ADMIS/download/45/Image_Processing_Ver03.00_02.zip

0 件のコメント:

コメントを投稿