我基本上要做的是使用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#的理解(我完全不熟悉)......
有关我如何设置和运行的任何提示?
答案 0 :(得分:5)
Kinect Toolbox已经提供了一种保存和重放流数据的方法(三者中的任何一个)。它可能会填补你需要的空缺。
如果您选择自己滚动,则需要保存基于零的时间戳,并将每个骨架保存到文件中。然后,当您希望重放它时,您可以使用DispatcherTimer
或Timer
从零开始计数 - 当您计时器达到下一个骨架的正确时间戳值时,显示它。
正如您所指出的,Kinect将为您提供约。 30 fps。你不想假设它以30 fps的速度运行。使用时间戳,以便在它应该播放时(可以是30 fps,或15 fps)