StackOverflow と Kinect SDK は初めてです。私は現在、Kinect からの記録/再生の色/深さとスケルトン データを含む最終年度のプロジェクトに取り組んでいます。これを可能にするKinect ツールボックスが見つかったので、ツールボックスを SDK サンプル プロジェクト (色/深度/スケルトンの基本 C# WPF) と統合して、以前に記録した .replay ファイルからすべてのストリームを表示できるプログラムを作成しています。
私が今抱えている問題は、ツールボックスの KinectReplay クラスと SDK の KinectSensor クラスの違いによるものです。Depth Basics サンプル コードでは、ストリームを表示するために、Kinect から取得したデータにスペースを割り当てる WindowLoaded() の次の行:
/
/ 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 オブジェクトからデータを取得しました。 「<code>this.replay = new KinectReplay(recordStream);」として KinectReplay オブジェクトから sensor.DepthStream.FramePixelDataLength」を取得します。?
私が考えることができる唯一の解決策は、「<code>this.depthPixels = new DepthImagePixel[e.FramePixelDataLength];」を呼び出すことです。これは、replay_DepthImageFrameReady(object sender, ReplayDepthImageFrameReadyEventArgs e)
KinectReplay から深度画像フレームを受信するたびに呼び出されます。したがって、DepthImagePixel の配列は何度も初期化されるため非効率的です。サンプル コードでは、これは 1 回だけ実行されます。