1

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 回だけ実行されます。

4

1 に答える 1

1

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 ツールボックスを使用するよりも実際には優れたオプションである可能性があります。以前は、Kinect Toolbox を記録/再生に使用していましたが、Kinect for Windows v 1.5 がリリースされたときに、自分で Kinect Studio に移行しました。これは、Kinect Studio の使用方法に関するビデオと、MSDN のガイドです。

于 2013-02-19T07:20:26.897 に答える