0

Kinect から特定の時間の関節の位置などのデータを取得する方法はありますか? 他の計算に使用するために、選択した特定の期間、このデータを取得して保存したいと思います。例としては、プログラム実行後 time = 5 秒とプログラム実行後 time = 10 秒におけるヘッドの位置データを取得し、変数に保存します。

実行中のエラー: コードの一部です ....

    void sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
    {
        if (closing)
        {
            return;
        }

        //Get a skeleton
        Skeleton first = GetFirstSkeleton(e);

        if (first == null)
        {
            return;
        }

        GetCameraPoint(first, e);

        using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
        {
            if (skeletonFrame == null)
            {
                return;
            }

            this.Recorder.Record(skeletonFrame); // I get an error after the RGB camera view freezes

        }
         // some more stuff 
     }

これは私が得るエラーメッセージです:

System.NullReferenceException が処理されませんでした Message=オブジェクト参照がオブジェクトのインスタンスに設定されていません。Source=SkeletalTracking StackTrace: SkeletalTracking.MainWindow.sensor_AllFramesReady (オブジェクト送信者、AllFramesReadyEventArgs e) で

記録を開始します this.Recorder.Record(skeletonFrame);か、それとも初期化して宣言するか、記録を開始する関数の 1 つを呼び出して、保存するファイルの名前を尋ねる必要がありますか?

データの再生により、特定のタイムスタンプ値とそれらのタイムスタンプに関連付けられたデータを引き出すことができますか?

4

3 に答える 3

1

Kinect ツールボックスは、骨格データの記録および再生機能を提供します。現在のフレームだけを取得するように指示する「スナップショット」モードをサポートしているかどうかはわかりませんが、コードをそのように適応させることはできます。

コールバックで適切なチェックを設定することで、独自のロールを作成できSkeletonFrameReadyます。すべてのスケルトン データは、SkeletonFrameReadyコールバックで利用できます。適切なデータを何らかのタイプのコレクションに保存する必要があるだけです。すべてのスケルトンを保存することも、タイマーを設定して確認し、?? 秒ごとにキャプチャすることもできます。

同様の質問と回答がここで扱われました: kinect c# draw and move skeleton from saved data

あなたが試すことができる他の何かは、タイマーですべての作業を行うことです:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    _savedSkeletons = new List<Skeleton>();

    _timer = new DispatcherTimer();
    _timer.Interval = TimeSpan.FromSeconds(5);
    _timer.Tick += (s, o) =>
    {
        using (SkeletonFrame skeletonFrame = KinectSensorManager.KinectSensor.SkeletonStream.OpenNextFrame(15))
        {
            if (skeletonFrame == null || skeletonFrame.SkeletonArrayLength == 0)
                return;

            // resize the skeletons array if needed
            if (_skeletons.Length != skeletonFrame.SkeletonArrayLength)
                _skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];

            // get the skeleton data
            skeletonFrame.CopySkeletonDataTo(_skeletons);

            foreach (var skeleton in _skeletons)
            {
                if (skeleton.TrackingState != SkeletonTrackingState.Tracked)
                    continue;

                _savedSkeletons.Add(skeleton);
            }
        }
    };

    _timer.Start();
}

この_savedSkeletons変数は、5 秒ごとにスケルトンを蓄積し続けます。それらをファイルに保存する場合は、データをシリアル化し、ファイル ストリームを介して書き出すことになります (オブジェクトをシリアル化して出力する方法の多くの例)。

上記のコードは単純な例で、Skeletonオブジェクトを格納するだけです。すべての目標を達成するには、タイムスタンプなどの追加情報を保存する必要がある場合があります。必要なすべての情報を格納し、それらのオブジェクトを格納するには、カスタム クラスを作成する必要があります。

Kinect ツールボックス (最初の段落にリンクされています) には既にレコーダーが含まれていることに注意してください。最初に試してみて、希望どおりになるかどうかを確認してください。

于 2012-11-28T23:07:43.663 に答える
1

はい、可能です。このためにKinect.Toolboxを使用しました。このライブラリには、フレームをディスクに記録し、保存されたフレームを再生できる Recorder および Replay クラスがあります。このライブラリを使用して成功しました。サンプル コードが必要な場合は、お知らせください。

この議論は大きくなっています。いくつかの質問を説明するためにこれを編集します

編集 1. KINECT.TOOLBOX のクイック チュートリアル

アプリケーションに 3 つのボタンを作成します (記録の開始、記録の停止、再生の開始)。

Form.cs のコード

    Stream recordStream;
    KinectRecorder Recorder;
    KinectReplay Replay;

記録開始ボタンのコード:

 protected void StartRecord(object sender, RoutedEventArgs e)
    {
        string generatedName = Guid.NewGuid().ToString();
        string recordStreamPathAndName = @"C:\" + generatedName + ".recorded";            
        this.recordStream = File.Create(recordStreamPathAndName);
        this.Recorder = new KinectRecorder(KinectRecordOptions.Color | KinectRecordOptions.Skeletons, recordStream);
    }

記録停止ボタンのコード

 if (Recorder != null)
        {
            Recorder.Stop();
            Recorder = null;
        }

リプレイボタンのコード

try
{
    recordStream = File.OpenRead(this.recordStreamPathAndName);
}
catch (Exception ex)
{
    throw ex;
}

    this.Replay = new KinectReplay(recordStream);
    this.Replay.ColorImageFrameReady += Replay_ColorImageFrameReady;
    this.Replay.SkeletonFrameReady += Replay_SkeletonFrameReady;
    this.Replay.Start();
}

ここで、カラーとスケルトンのレコーダーを有効にします。今度は、骨格データのみを記録します。たとえば、ポーポーズです。SkeletonFrameReady イベント ハンドラーで、次のようなことを行う必要があります。

using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
{
    if (skeletonFrame == null)
        return;
        // any other validations...
    this.Recorder.Record(skeletonFrame);
}

わかりました、フレームを記録しました。再生ボタンのコードを見てください。 のイベント ハンドラーを作成したことReplaySkeletonFrameReadyを覚えていますか? (this.Replay.SkeletonFrameReady += Replay_SkeletonFrameReady;)

    void Replay_SkeletonFrameReady(object sender, ReplaySkeletonFrameReadyEventArgs e)
    {
        // do your stuff.
    }

SkeletonFrameReady で記録されたスケルトンを取得するので、スケルトンを取得して保存されたデータを使用できます。

于 2012-11-28T23:09:03.573 に答える
0

C# で x 秒間待機する最も簡単な方法は

System.Threading.Thread.Sleep(x000);//where x is the time in seconds for which you want app to wait

例:

System.Threading.Thread.Sleep(4000);//will wait for 4 seconds

もう1つの方法は、タイマーオブジェクトを使用してそれらを有効無効にし、ループコード内のフォーム静的値を読み取り、何かを記録する必要があるかどうかをブール値で確認することです

于 2016-02-05T16:34:33.213 に答える