3

私が基本的にやろうとしているのは、C#とKinect SDKを使用してkinectスケルトンフレームデータ(ジョイント位置)をファイルに書き込み(完了)、このデータを外部で処理(完了)してから、データをアプリケーションに読み戻す(完了)ライトポイントウォーカー(スケルトンジョイント)としてフレームごとにデータを描画するので、アニメーションが表示されます。(問題)

私の質問は、C#(およびそのDrawingContextクラス)を使用してこの30fpsアニメーションを描画するにはどうすればよいですか?

レコーディング中にすでにSkeletonFramesのライブ出力に使用しているため、DrawingContextを使用したかったのです。そこでは、「Skeleton Basics」SDKの例と同様に、次のように簡単に実行されます。

this.sensor.SkeletonFrameReady += this.SensorSkeletonFrameReady;
...

private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
    {
        ...

        using (DrawingContext dc = this.drawingGroup.Open())
        {
        ...
           dc.DrawEllipse(drawBrush, null, 2Dpoint, JointThickness, JointThickness);

        }
    }

したがって、kinectは約でフレームを提供してくれます。イベントを使用して30fpsで、データを描画するだけです。

しかし、kinectがなく、データがファイル/メモリから読み取られる場合、どうすれば描画できますか?(現在、2DArray [フレーム、ジョイント]を使用しています)

スレッドを30fpsで実行することを考えました(フレームレートを達成するためにスリープを使用)。その後、同様のイベントを送信するか、直接描画します。しかし、これを機能させる試みは完全に失敗しました。たとえば、描画のためにイベントがメインスレッドに送信されませんでした。

問題は、C#を理解していないことかもしれません(私はまったく新しいです)...

これを設定して機能させる方法についてのヒントはありますか?

4

1 に答える 1

5

Kinectツールボックスには、ストリームデータ(3つのうちのいずれか)を保存および再生する方法がすでに用意されています。それはあなたが必要とするもののために穴を埋めるかもしれません。

自分でロールすることを選択した場合は、各スケルトンをファイルに保存して、ゼロベースのタイムスタンプを保存することをお勧めします。次に、再生する場合は、DispatcherTimerまたはTimerを使用してゼロからいつでもカウントできます。タイマーが次のスケルトンの適切なタイムスタンプ値に達したときに、それを表示します。

ご指摘のとおり、Kinectは30fps。あなたはそれが完全な30fpsで実行されていると仮定したくありません。タイムスタンプを使用して、必要なときに再生します(30fpsまたは15fps)

于 2012-12-18T20:28:29.880 に答える