3

我基本上想做的是使用 C# 和 Kinect SDK(完成)将 kinect 骨架帧数据(关节位置)写入文件,然后在外部处理这些数据(完成),然后将数据读回我的应用程序(完成)并逐帧将数据绘制为光点步行者(骨架关节),以便我看到动画。(问题)

我的问题是:如何使用 C#(及其 DrawingContext 类)绘制这个 30fps 动画?

我想使用 DrawingContext,因为我在录制时已经将它用于 SkeletonFrames 的实时输出。就像这样简单地完成,类似于“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 [Frame, Joint])

我想过让一个线程以 30fps 运行(使用睡眠来实现帧率),然后发送一个类似的事件或直接绘制。但是我试图让这个工作完全失败。例如,我没有将事件发送到主线程进行绘图。

问题可能是我缺乏对 C# 的理解(我对它完全陌生)......

关于如何设置和工作的任何提示?

4

1 回答 1

5

Kinect 工具箱已经提供了一种保存和重放流数据的方法(三者中的任何一个)。它可能会填补您需要的空白。

如果您选择自己滚动,您将希望保存一个从零开始的时间戳,并将每个骨架保存到文件中。然后,当您希望重播它时,您可以使用DispatcherTimerTimer从零计数到任何时候——当您的计时器达到下一个骨架的正确时间戳值时,显示它。

正如你所指出的,Kinect 会给你大约。30 帧/秒。您不想假设它以 30 fps 的速度运行。使用时间戳以便在应该播放的时候播放它(无论是 30 fps 还是 15 fps)

于 2012-12-18T20:28:29.880 回答