我是StackOverflow和Kinect SDK的新手。我目前正在研究我的最后一年项目,该项目涉及记录/重放颜色/深度和Kinect的骨架数据。找到了Kinect Toolbox来实现这一点,我正在将工具箱与SDK示例项目(颜色/深度/骨架基础知识C#WPF)集成,以生成一个程序,可以显示之前记录的.replay文件中的所有这些流。
我现在遇到的问题是由于KinectReplay类与工具箱和SDK中的KinectSensor类的不同。在Depth Basics示例代码中,为了显示流,WindowLoaded()中的以下行为从Kinect检索的数据分配空间:
/
/ Allocate space to put the depth pixels we'll receive
this.depthPixels = new DepthImagePixel[this.sensor.DepthStream.FramePixelDataLength];
// Allocate space to put the color pixels we'll create
this.colorPixels = new byte[this.sensor.DepthStream.FramePixelDataLength * sizeof(int)];
// This is the bitmap we'll display on-screen
this.colorBitmap = new WriteableBitmap(this.sensor.DepthStream.FrameWidth, this.sensor.DepthStream.FrameHeight, 96.0, 96.0, PixelFormats.Bgr32, null);
//The code below came from "Skeleton basics C# WPF", which I need to find the correspondence of "CoordinateMapper" in KinectReplay Class
// We are not using depth directly, but we do want the points in our 640x480 output resolution.
DepthImagePoint depthPoint = this.sensor.CoordinateMapper.MapSkeletonPointToDepthPoint(skelpoint, DepthImageFormat.Resolution640x480Fps30);
在原始示例代码中,从KinectSensor对象中检索了上述对象大小的参数,我需要做类似的事情,但是从KinectReplay对象获取数据,例如,我如何获得“{{ 1}}“从KinectReplay对象”this.sensor.DepthStream.FramePixelDataLength
“?
我能想到的唯一解决方案就是打电话给“this.replay = new KinectReplay(recordStream);
;
“在每次从KinectReplay接收到深度图像帧时调用的this.depthPixels = new DepthImagePixel[e.FramePixelDataLength]
中。因此,DepthImagePixel数组将被初始化多次,这是低效的,并且在示例代码中,这将只执行一次。
答案 0 :(得分:1)
一种解决方案是在初始化期间简单地获取帧中的像素数,并始终使用此值,因为记录帧中的像素数不太可能发生变化。
例如,假设您有一个名为OnNewDepthReplay帧的方法,您可以执行以下操作(未经测试,语法可能已关闭):
public void OnNewDepthReplayFrame(DepthReplayFrameEventArgs e) {
if (depthPixels == null) {
depthPixels = new new DepthImagePixel[eFramePixelDataLength];
}
// code that uses your depthPixels here
}
但是,使用Kinect 1.5和1.6 SDK附带的记录/重放功能实际上可能比使用Kinect Toolbox更好。我曾经使用Kinect Toolbox进行录制/重放,但是当Kinect for Windows v 1.5问世时,我自己就转移到了Kinect Studio。以下是关于如何使用Kinect Studio以及video的guide on MSDN。