从文件到屏幕绘制骨架动画

时间:2012-12-18 19:44:55

标签: c# kinect frame-rate drawingcontext

我基本上要做的是使用C#& amp;将kinect骨架帧数据(关节位置)写入文件。 Kinect SDK(完成),然后在外部处理这些数据(完成),然后将数据读回我的应用程序(完成)并逐帧绘制数据作为光点漫步者(骨架关节),这样我就看到了一个动画。 (问题)

我的问题是:如何使用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运行(使用sleep来实现帧率)然后发送一个类似的事件或直接绘制..但是我的尝试让这个工作完全失败了。例如,我没有将事件发送到主线程进行绘制。

问题可能是我缺乏对C#的理解(我完全不熟悉)......

有关我如何设置和运行的任何提示?

1 个答案:

答案 0 :(得分:5)

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

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

正如您所指出的,Kinect将为您提供约。 30 fps。你不想假设它以30 fps的速度运行。使用时间戳,以便在它应该播放时(可以是30 fps,或15 fps)