3

XNA Framework 4.0と を使用してゲームを開発していKinect 1.6 SDKます。私のコードは色、深度、スケルトン データを使用しているため、AllFramesReadyイベントを使用しています。

ゲームを実行し、検出する人がいると、イベントによってトリガーされる関数がそのAllFramesReady人の画像とスケルトン データを抽出し、Playerクラスの属性を設定します。

問題は、このコードが過去に完全に機能していたことです。しかし、コードに変更を加えていませんが、現在は機能していません。他のコンピューターで試してみましたが、うまくいきました。しかし、同じコードが私のコンピューターでは機能しません。

私がデバッグしたとき、私はそれを見DepthFrameEventReadyArgsColorFrameEventReadyArgs、メンバーが呼び出されisInvalid、それらがtrueに設定されました。このため、私が使用するとき:

DepthImageFrame depthVideoFrame = mainFrame.OpenDepthImageFrame();

... null を取得しますdepthVideoFrame。カラーフレームも同様です。

Kinectを初期化する場所は次のとおりです(Initialize):

if (KinectSensor.KinectSensors.Count > 0)
            {
                kinect = KinectSensor.KinectSensors[0];

                EnableColorStream(kinect);
                EnableDepthStream(kinect);
                EnableSkeletonStream(kinect);

                kinect.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(kinect_AllFramesReady);
                kinect.Start();
            }

メソッドを有効にする:

void EnableColorStream(KinectSensor ks)
        {
            ks.ColorStream.Enable(ColorFormat);
            colorWidth = ks.ColorStream.FrameWidth;
            colorHeight = ks.ColorStream.FrameHeight;
            colorVideo = new Texture2D(graphics.GraphicsDevice, ks.ColorStream.FrameWidth, ks.ColorStream.FrameHeight);
        }

        void EnableDepthStream(KinectSensor ks)
        {
            ks.DepthStream.Enable(DepthFormat);
            depthWidth = ks.DepthStream.FrameWidth;
            depthHeight = ks.DepthStream.FrameHeight;
            depthVideo = new Texture2D(graphics.GraphicsDevice, ks.DepthStream.FrameWidth, ks.DepthStream.FrameHeight);
        }

        void EnableSkeletonStream(KinectSensor ks)
        {
            TransformSmoothParameters tsp = new TransformSmoothParameters();
            tsp.Smoothing = 0f;
            tsp.Correction = 0.1f;
            tsp.Prediction = 0.1f;
            tsp.JitterRadius = 0.1f;
            tsp.MaxDeviationRadius = 0.1f;
            ks.SkeletonStream.Enable(tsp);
        }

kinect_AllFramesReady私は次のようなものを使用しています:

using (ColorImageFrame colorVideoFrame = imageFrames.OpenColorImageFrame())
{
   ...
}
using (SkeletonFrame skeletonFrame = imageFrames.OpenSkeletonFrame())
{
   ...
}
using (DepthImageFrame depthVideoFrame = imageFrames.OpenDepthImageFrame())
{
   ...
}

デバッグすると、 member が に設定されているため、colorVideoFrameと のdepthVideoFrame値がであることがわかりました。深度と色のデータを使用して他のプログラムを実行すると、正常に実行されますが、この 1 つだけが機能しません。私は現在アイデアがありません。助けてくれてありがとう。nullisInvalidtrue

4

1 に答える 1

0

おそらく、これを試してみてください。コメント投稿者の 1 人が示唆したように、AllFramesReady しか呼び出さないため、このエラーが発生する可能性があります。SkeletonFrame、ColorFrame、および DepthFrameReady イベント ハンドラーで個別に呼び出す必要がある場合があります。元。

void DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
{
 DepthImageFrame imageFrame = e.OpenDepthImageFrame();
 if (imageFrame != null)
 {
   // Do your business here
 }
}

この回答を使用する理由は、Kinect for Windows SDK のドキュメントに、「新しい ColorImageFrame オブジェクト内のカラー データのフレーム、またはデータが利用できなくなった場合は NULL」と記載されているためです。また、使用しているマシンは、コードが動作していた他のマシンとは異なる設定になっている可能性があるため、K4WSDK またはコンパイラに違いがあると、コンパイル後のプログラムの動作が大幅に変わる可能性があります。

これが機能しない理由については、マシンのコンパイラの問題である可能性があります。VS に同じバージョンのコンパイラがあることを確認しましたか? VSの同じバージョンですか?また、適切なライブラリとインクルードがすべてマシンに存在することを確認しましたか? 根本的な原因を本当に特定したい場合は、動作中のマシンを調べて、自分のマシンと比較することができます。

于 2013-03-17T00:23:53.427 に答える