0

遅いコンピューターで kinect を使用したり、重いフレーム単位の計算が必要な場合に、実際に何が起こるかを理解するのに苦労しています。

深さを復元するためのC# サンプル コードを考えてみましょう。

実行時のダイナミクスは、イベントによって駆動されますDepthFrameReady。ここで報告される関数DepthImageReadyは、そのようなイベントがトリガーされたときに呼び出されます。

 private void DepthImageReady(object sender, DepthImageFrameReadyEventArgs e)
 {
    using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
    {
        if (depthFrame != null)
        {
           depthFrame.CopyDepthImagePixelDataTo(this.depthPixels);

           //MY OPERATIONS BLABLABLA...
        } 
        else
        {
         // depthFrame is null because the request did not arrive in time
        }
    }
 }

私の相互相関の質問は次のとおりです。

  • この関数は実際にすべてのフレームで呼び出されますか?
  • なぜそれdepthFrameができるのNullですか?
  • 操作に通常のフレーム間時間 (33ms) よりも時間がかかる場合、実際にはどうなりますか?
  • キネクト内にバッファはありますか?

どんな助けでも感謝します。

4

2 に答える 2

1

ここのチュートリアルによると:

そのチュートリアルによると、イベントはフレームごとに発生します (つまり、イベント キューに入れられます)。ただし、前のフレームの処理に時間がかかりすぎると、次のフレームを処理するときにOpenDepthImageFrame()メソッドが を返しnull、フレームがそのフレームであることを示します。データは利用できなくなりました。

于 2013-09-27T13:30:02.250 に答える
0

メカニックは単なるバッファだと思います イベント(画像検索の開始)は、データがあるときに発生します。データは保存されない (キューに入れられない) ため、起動される新しいスレッドごとに消去され、再度書き込まれます。したがって、 !=null のチェックがあります

バックグラウンドで新しいバッファ領域を指すポインタを使用してスレッドを生成し、バッファ ポインタを変更する (新しいフレームのロードが完了する) ことにより、ポインタを交換するだけで、事実上、古いスレッドと古いデータの null ポインタになります。新しいスレッドが新しいデータを保持している間 (そのスレッドが生きている限り、データは保持されます)。ただし、キューに入れられたスレッドにはデータが含まれていない (ポインターがスワップされた) ため、アプリに対しては、トレッド キューが構築されません。古いスレッドの画像データもキューに入れられません。

それがうまくいくと思いますが、私は彼らのソースコードを持っていません。誰も持っていません。

于 2016-03-25T14:58:51.570 に答える