プロが教えるわが家の防犯対策術!

Direct showでUSBカメラキャプチャーしようとしています。
現在、6台のUSBカメラを接続し、連続して撮影をしています。
問題はキャプチャーする時間が長く、640x480画素モードで1000mS、1600x1200画素モードで2000ms程かかります。
Direct Showを使用する場合、この程度かかるのは普通でしょうか。
試しにプログラムに時間計測させた所、

FMediaControl->Run(); で640x480 の時160mS 1600x1200の時620mS(カウンター2-3間)

FMediaControl->Stop(); で640x480 の時310mS 1600x1200の時330ms(カウンター5-6間)

かかって居ました。

プログラム自体は先人が作成したもので、私はDirectXが良く分からないので、これから勉強し、時間が短く出来るのであれば挑戦したいと思って居ます。
ただ、他の開発時間も足りないので、初めからこの位かかるのが正常ならばここの部分はそのままにして置きたいと思い、質問させて頂きました。
  
下記に使用して居るプログラムの抜粋を記します。

この処理時間が正常なのか、正常で無い場合、考えられる原因、若しくは原因の調査の仕方をお教え頂ければ幸いです。

DWORD dTime0;
DWORD dTime1;
DWORD dTime2;
DWORD dTime3;
DWORD dTime4;
DWORD dTime5;
DWORD dTime6;

dTime0 = GetTickCount();
FCurrentCam = Cam;
FCaptured = false;
dTime2 = GetTickCount() - dTime0;
hr = FMediaControl->Run();
dTime3 = GetTickCount() - dTime0;
DWORD dTime0;
DWORD dTime1;
DWORD dTime2;
DWORD dTime3;
DWORD dTime4;
DWORD dTime5;
DWORD dTime6;
dTime0 = GetTickCount();
// 前回のキャプチャー終了待ち
for( int i=0; i<100 && FBusy; i++ ) {
Sleep( 100 );
}

if( FCurrentCam!=Cam ) { // カメラが同じ場合レンタリングしなおす必要なし
   // レンダリングしなおし部分省略

}
FCurrentCam = Cam;
FCaptured = false;
dTime2 = GetTickCount() - dTime0;
hr = FMediaControl->Run();
dTime3 = GetTickCount() - dTime0;

DWORD Ed = GetTickCount() + 3000; // 3000はタイムアウト
do {
Application->ProcessMessages();
Sleep( 20 );
} while( !FCaptured );
dTime4 = GetTickCount() - dTime0;
long ImageSize = Cam->prImageSize;
dTime5 = GetTickCount() - dTime0;
frmMain->lHrs[22] = FMediaControl->Stop();

dTime6 = GetTickCount() - dTime0;;
FBusy = false;
return Cam->prImage;
}

A 回答 (4件)

#1 です。


>Run/Stopを繰り返さないで、どの様にキャプチャー出来るのでしょうか?

参考URLは SDK の 「サンプル グラバの使い方」というものです。
簡単に言えば、Run() 状態のまま、カメラのストリームから欲しい時にだけスナップショットでイメージを得る方法です。Stop() はアプリが終わるまで呼びません(時間が掛かるので)。

この方法の実装はネットで幾つか見つかると思います(どれも似ています)。
しかし、複数台のカメラで有効なのかどうか私には判りません。

よって #1に書いた「個人的にどうなのかな?」の部分は次のように言い換えたい思います。
・カメラが1台ならRun/Stopは繰り返さない方が早いと思う。しかし、複数台のカメラになると、そうせざるを得ないのも知れない。...です。

参考URL:http://msdn.microsoft.com/ja-jp/library/cc371163 …
    • good
    • 1
この回答へのお礼

再度のご回答ありがとうございした。

グラバーで検索するんですね。昨日はPose等をやって見ましたが、違う所を探していた様です。
これから会社に行って探してみます。
会社の環境だと、質問サイトはセキュリティーのブロックがかかってしまい、家には開発環境が無いので直ぐに試す事が出来ません。
これで解決出来るといいのですが。

ありがとうございました。

お礼日時:2011/07/14 06:57

ANo.2さんへの返答に近いのですが、複数カメラでもRun,Pauseを繰り返す必要がありません。

ただしマルチスレッドを使った場合の話ですが。
DirectShowはマルチスレッドでの利用が出来るようです。
    • good
    • 0
この回答へのお礼

再度のご回答ありがとうございます。

現在、davidfox さんの書き込みを元に、GetCurrentBufferで画像を入力しようと思っていますが、何故か最初の画像しか取得出来ないでいます。

ただ、京都大学の川島講師のサンプルプログラムで、画像の連続取得には成功しています。
これは昨年やったものですが、川島講師のサンプルプログラムの中にGetCurrentBufferを使ったものもありましたので、今週はこれを参考に検討を進めて見ようと思っています。
DirectXを全く知らない私にはちょっときつい開発です。
http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewi …

お礼日時:2011/07/17 09:46

明らかに無駄な処理をしていることによる遅さですね。

そんなにかかりません。
ちなみにRunとStopは繰り返してもいいですがものすごく短い時間間隔では無論行ってはいけません。
複数カメラが合ってもマルチスレッドを使うことによって同時にキャプチャできます。静止画ではなくて動画です。
    • good
    • 0

回答と言えるレベルではないので参考程度でお願いします。



私は1台のカメラ接続しか経験が有りませんが、640x480で160+310=470msec ... x6台であるのと、ハードの性能を考えると、明らかにおかしいとは言えないように感じます。
とは言え、Run/Stop を繰り返すのは個人的にどうなのかな?と思いますが。

手間(と費用)を掛けて、お使いのカメラメーカーに相談するのが良いと思いますが、そこは状況次第ですね。

この回答への補足

ご回答、ありがとうございます。

>640x480で160+310=470msec ... x6台であるのと、

測定時間は6台のカメラでは無く、1台のカメラでのキャプチャー時間です。

>とは言え、Run/Stop を繰り返すのは個人的にどうなのかな?と思いますが。

Run/Stopを繰り返さないで、どの様にキャプチャー出来るのでしょうか?
キャプチャーの開始(Run)、キャプチャーの終了待ち(Stop)と思って居るのですが私の理解の誤りでしょうか?
Run/Stop以外でキャプチャーする方法があればお教え下さい。

補足日時:2011/07/13 06:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!