Beispiel #1
0
        private void DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
        {
            DepthImageFrame frame = e.OpenDepthImageFrame();

            if (frame != null)
            {
                this.FInvalidate = true;
                if (frame.FrameNumber != this.frameindex)
                {
                    this.frameindex = frame.FrameNumber;

                    int cnt = 0;
                    for (int h = 0; h < 240; h++)
                    {
                        for (int w = 0; w < 320; w++)
                        {
                            SkeletonPoint sp = frame.MapToSkeletonPoint(w, h);
                            this.color0[cnt]     = sp.X;
                            this.color0[cnt + 1] = sp.Y;
                            this.color0[cnt + 2] = sp.Z;
                            this.color0[cnt + 3] = 1.0f;
                            cnt += 4;
                        }
                    }

                    frame.Dispose();

                    lock (m_lock)
                    {
                        float[] tmp = this.color0;
                        this.color0 = this.color1;
                        this.color1 = tmp;
                    }
                }
            }
        }
        /// <summary>
        /// 距離データをカラー画像に変換する
        /// </summary>
        /// <param name="kinect"></param>
        /// <param name="depthFrame"></param>
        /// <returns></returns>
        private void HeightMeasure(KinectSensor kinect, DepthImageFrame depthFrame, SkeletonFrame skeletonFrame)
        {
            ColorImageStream colorStream = kinect.ColorStream;
            DepthImageStream depthStream = kinect.DepthStream;

            // トラッキングされている最初のスケルトンを取得する
            // インデックスはプレイヤーIDに対応しているのでとっておく
            Skeleton[] skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
            skeletonFrame.CopySkeletonDataTo(skeletons);

            int playerIndex = 0;

            for (playerIndex = 0; playerIndex < skeletons.Length; playerIndex++)
            {
                if (skeletons[playerIndex].TrackingState == SkeletonTrackingState.Tracked)
                {
                    break;
                }
            }
            if (playerIndex == skeletons.Length)
            {
                return;
            }

            // トラッキングされている最初のスケルトン
            Skeleton skeleton = skeletons[playerIndex];

            // 実際のプレイヤーIDは、スケルトンのインデックス+1
            playerIndex++;

            // 頭、足先がトラッキングされていない場合は、そのままRGBカメラのデータを返す
            Joint head      = skeleton.Joints[JointType.Head];
            Joint leftFoot  = skeleton.Joints[JointType.FootLeft];
            Joint rightFoot = skeleton.Joints[JointType.FootRight];

            if ((head.TrackingState != JointTrackingState.Tracked) ||
                (leftFoot.TrackingState != JointTrackingState.Tracked) ||
                (rightFoot.TrackingState != JointTrackingState.Tracked))
            {
                return;
            }

            // 距離カメラのピクセルごとのデータを取得する
            short[] depthPixel = new short[depthFrame.PixelDataLength];
            depthFrame.CopyPixelDataTo(depthPixel);

            // 距離カメラの座標に対応するRGBカメラの座標を取得する(座標合わせ)
            ColorImagePoint[] colorPoint = new ColorImagePoint[depthFrame.PixelDataLength];
            kinect.MapDepthFrameToColorFrame(depthStream.Format, depthPixel,
                                             colorStream.Format, colorPoint);

            // 頭のてっぺんを探す
            DepthImagePoint headDepth = depthFrame.MapFromSkeletonPoint(head.Position);
            int             top       = 0;

            for (int i = 0; (headDepth.Y - i) > 0; i++)
            {
                // 一つ上のY座標を取得し、プレイヤーがいなければ、現在の座標が最上位
                int index  = ((headDepth.Y - i) * depthFrame.Width) + headDepth.X;
                int player = depthPixel[index] & DepthImageFrame.PlayerIndexBitmask;
                if (player == playerIndex)
                {
                    top = i;
                }
            }

            // 頭のてっぺんを3次元座標に戻し、足の座標(下にあるほう)を取得する
            // この差分で身長を測る
            head.Position = depthFrame.MapToSkeletonPoint(headDepth.X, headDepth.Y - top);
            Joint foot = (leftFoot.Position.Y < rightFoot.Position.Y) ? leftFoot : rightFoot;

            // 背丈を表示する
            DrawMeasure(kinect, colorStream, head, foot);
        }