2

私は現在、画像処理アプリケーションに取り組んでいます。アプリケーションは Web カメラから画像をキャプチャし、その上で何らかの処理を行います。アプリはリアルタイムで応答する必要があります (各リクエストを処理するのに 50 ミリ秒未満が理想的です)。私は持っているコードでいくつかのタイミング テストを行っており、非常に興味深いものを見つけました (以下を参照)。

clearLog();
log("Log cleared");

camera.QueryFrame();
camera.QueryFrame();
log("Camera buffer cleared");

Sensor s = t.val;
log("Sx: " + S.X + " Sy: " + S.Y);

Image<Bgr, Byte> cameraImage = camera.QueryFrame();
log("Camera output acuired for processing");

logが呼び出されるたびに、処理を開始してからの時間が表示されます。これが私のログ出力です:

[3 ms]Log cleared
[41 ms]Camera buffer cleared
[41 ms]Sx: 589 Sy: 414
[112 ms]Camera output acuired for processing

StopWatchタイミングはfromを使用して計算されSystem.Diagonosticsます。上記の時間は累積です。したがって、ログのクリアには 3ms かかりました。また、「カメラ バッファのクリア」には (41-3 = 38ms) かかりました。

質問1

同じメソッドが 2 回呼び出されると約 40 ミリ秒で実行され、次に 1 回呼び出されると実行に時間がかかる (約 70 ミリ秒) ため、これは少し興味深いと思います。

値を代入するのにそれほど時間がかかることはありませんよね?

質問2

また、上記の各ステップのタイミングは、その時々によって異なります。一部のステップの値は、0 ミリ秒ほど低い場合もあれば、100 ミリ秒ほど高い場合もあります。ほとんどの数値は比較的一貫しているように見えますが。

これは、CPUがその間に他のプロセスによって使用されたためではないでしょうか? (これが他の理由である場合は、私に知らせてください)

この関数が実行されたときに確実に最高の優先度を取得する方法はありますか? 速度テストの結果が一貫して(時間的に)低くなるようにします。

編集

上記の 2 つの空白クエリ フレームを削除するようにコードを変更したため、コードは次のようになりました。

clearLog();
log("Log cleared");

Sensor s = t.val;
log("Sx: " + S.X + " Sy: " + S.Y);

Image<Bgr, Byte> cameraImage = camera.QueryFrame();
log("Camera output acuired for processing");

タイミング結果は次のとおりです。

[2 ms]Log cleared
[3 ms]Sx: 589 Sy: 414
[5 ms]Camera output acuired for processing

次のステップにかかる時間が長くなりました (次のステップが以前はほぼ瞬時に行われていたのに対し、次のステップが 20 ~ 30 ミリ秒後にジャンプする場合があります)。これはCPUのスケジューリングによるものだと思います。このコードを実行している間、CPU が他のことをするようにスケジュールされないようにする方法はありますか?

4

2 に答える 2

1

カメラに要求しても実際には「フレームを取得」しない可能性がありますが、常に実行しています。次に、画像データを要求し、それが十分に新鮮な場合、データはすぐに返されます。しかし、運が悪く、データが古くなっている場合は、新しい画像が取得されるまで待つ必要があります。カメラが 25 fps を実行する場合、50 ミリ秒の遅延を意味する可能性があります (実際のフォトン収集だけでなく、データ転送も)。

カメラを低解像度に設定してみてください (フレームレートが上がるように)。遅延は減少しますか?

于 2010-03-31T22:08:01.117 に答える
0

ソースがなければ、「何が可能か」と言うのはほとんど不可能です。

ストップウォッチが低解像度モードの場合、タイミングが難しくなります。実際に任意の測定値を生成できることを確認するためだけに、いくつかのループを記述することは価値があるかもしれません (つまり、過度の粒度のない任意のミリ秒数)。

プロファイラーを使ってみましたか?それは、その時点でプロセスが他に何をしているのかについてのあなたの質問に答えるかもしれません.

于 2010-03-29T08:40:42.310 に答える