0

Kinect for Xbox360 を使用して人の移動距離を計算する単純なプログラムのように見えるものを開発しようとしています。Kinect が向けられる部屋は 10 x 10 になります。ユーザーがボタンを押すと、対象はこの空間を移動します。被験者がエリア内の最終目的地に到達したら、ユーザーはもう一度ボタンを押します。Kinect は、2 つのボタンを押す間に被験者が移動した距離を出力します。これまで Kinect 向けに開発したことがないため、始めるのはかなり困難でした。私の問題は、距離を測定するために何を使用すべきか完全にはわからないことです。私の研究では、Kinect からオブジェクトまでの距離を計算する方法を見つけましたが、それだけです。

4

1 に答える 1

0

あなたが聞いたことは、デカルト平面を扱うという単純な問題です。Kinect には XYZ 空間に存在する 20 個のジョイントがあり、距離はメートル単位で測定されます。これらのジョイントにアクセスするために、「トラッカー」クラス内に次のステートメントがあります (これは C# です... SDK で C# を使用しているか C++ を使用しているかは不明です)。

public Tracker(KinectSensor sn, MainWindow win, string fileName)
        {
            window = win;

            sensor = sn;
            try
            {
                sensor.Start();
            }
            catch (IOException)
            {
                sensor = null;
                MessageBox.Show("No Kinect sensor found. Please connect one and restart the application", "*****ERROR*****");
                return;
            }

            sensor.SkeletonFrameReady += SensorSkeletonFrameReady;   //Frame handlers
            sensor.ColorFrameReady += SensorColorFrameReady;
            sensor.SkeletonStream.Enable();
            sensor.ColorStream.Enable();
        }

これらは、Kinect からのカラー ストリームとスケルトン ストリームにアクセスします。スケルトン ストリームにはジョイントが含まれているため、次のステートメントでそれに注目します。

//Start sending skeleton stream
        private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            //Access the skeleton frame
            using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
            {

                if (skeletonFrame != null)
                {
                    //Check to see if there is any data in the skeleton
                    if (this.skeletons == null)

                        //Allocate array of skeletons
                        this.skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];

                    //Copy skeletons from this frame
                    skeletonFrame.CopySkeletonDataTo(this.skeletons);

                    //Find first tracked skeleton, if any
                    Skeleton skeleton = this.skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked).FirstOrDefault();
                    if (skeleton != null)
                    {
                        //Initialize joints
                        ///<summary>
                        ///Joints to be displayed, projected, recorded, etc.
                        ///</summary>
                        Joint leftFoot = skeleton.Joints[JointType.FootLeft];
                    }
                }

したがって、プログラムの開始時にジョイントを選択し (20 個あります... プログラムを実行するときに常に Kinect の方を向くジョイントを 1 つ選択します)、次のようなステートメントでその位置を取得します。

if(skeleton.Joints[JointType.FootLeft].TrackingState == JointTrackingState.Tracked)
{
    double xPosition = skeleton.Joints[JointType.FootLeft].Position.X;
    double yPosition = skeleton.Joints[JointType.FootLeft].Position.Y;
    double zPosition = skeleton.Joints[JointType.FootLeft].Position.Z;
}

最後に、ストリームを停止する前に、わずかな遅延が必要です... クリックしてから Kinect からストリームを遮断するまでの時間です。次に、2 点間の距離を取得するために必要な計算を行います。遅延がないと、デカルト ポイントを取得できません。

于 2013-06-05T19:38:42.120 に答える