Esempio n. 1
0
        private void AllFrameReady(object sender, AllFramesReadyEventArgs e)
        {
            //Console.Clear();
            using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
            {
                if (skeletonFrame != null)
                {
                    skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
                    skeletonFrame.CopySkeletonDataTo(this.skeletons);
                    Skeleton skel = skeletons[0];
                    if (skel.TrackingState == SkeletonTrackingState.Tracked)
                    {
                        SkeletonPoint rightHand = skeletons[0].Joints[JointType.HandRight].Position;
                        SkeletonPoint head      = skeletons[0].Joints[JointType.Head].Position;
                        rightHandPosition = SkeletonPointToScreen(rightHand);
                        headPosition      = SkeletonPointToScreen(head);
                    }
                }
            }

            using (ColorImageFrame colorFrame = e.OpenColorImageFrame())
            {
                if (colorFrame != null)
                {
                    // Copy the pixel data from the image to a temporary array
                    colorFrame.CopyPixelDataTo(this.colorPixels);

                    // Write the pixel data into our bitmap
                    this.ColorWriteBitmap.WritePixels(
                        new System.Windows.Int32Rect(0, 0, this.ColorWriteBitmap.PixelWidth, this.ColorWriteBitmap.PixelHeight),
                        this.colorPixels,
                        this.ColorWriteBitmap.PixelWidth * sizeof(int),
                        0);
                }
            }

            using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
            {
                if (depthFrame != null)
                {
                    var sw = Stopwatch.StartNew();
                    // Copy the pixel data from the image to a temporary array
                    depthFrame.CopyDepthImagePixelDataTo(this.depthPixels);
                    // short[] depthData = new short[depthFrame.PixelDataLength];
                    // Get the min and max reliable depth for the current frame
                    int minDepth = depthFrame.MinDepth;
                    int maxDepth = depthFrame.MaxDepth;
                    int width    = depthFrame.Width;
                    int height   = depthFrame.Height;

                    if (headPosition.X == 0)
                    {
                        headDepth = 100;
                    }
                    else
                    {
                        headDepth = depthPixels[headPosition.X + headPosition.Y * 640].Depth;
                    }

                    sw.Restart();
                    //*********** Convert cull and transform*****************
                    colorizer.TransformCullAndConvertDepthFrame(
                        depthPixels, minDepth, maxDepth, colorPixels,
                        AngleRotateTan,
                        (short)(headDepth - (short)CullingThresh), headPosition);

                    Image <Bgra, byte> depthImg;
                    //Console.WriteLine("iteration:" + sw.ElapsedMilliseconds);
                    sw.Restart();


                    Image <Gray, Byte> rightFront = null;
                    Image <Gray, Byte> leftFront  = null;
                    depthImg = ImageConverter.Array2Image(colorPixels, width, height, width * 4);
                    PointF rightVector   = PointF.Empty;
                    PointF leftVector    = PointF.Empty;
                    bool   isSkip        = false;
                    bool   leftHandRaise = false;
                    if (skeletons != null && skeletons[0].TrackingState == SkeletonTrackingState.Tracked)
                    {
                        PointF hr  = SkeletonPointToScreen(skeletons[0].Joints[JointType.HandRight].Position);
                        PointF hl  = SkeletonPointToScreen(skeletons[0].Joints[JointType.HandLeft].Position);
                        PointF er  = SkeletonPointToScreen(skeletons[0].Joints[JointType.ElbowRight].Position);
                        PointF el  = SkeletonPointToScreen(skeletons[0].Joints[JointType.ElbowLeft].Position);
                        PointF hip = SkeletonPointToScreen(skeletons[0].Joints[JointType.HipCenter].Position);
                        // hand is lower than hip
                        //Console.WriteLine(skeletons[0].Joints[JointType.HandRight].Position.Y);
                        //Console.WriteLine(skeletons[0].Joints[JointType.HipCenter].Position.Y);
                        //Console.WriteLine("-------------");
                        if (skeletons[0].Joints[JointType.HandRight].Position.Y <
                            skeletons[0].Joints[JointType.HipCenter].Position.Y + 0.05)
                        {
                            isSkip = true;
                        }
                        if (skeletons[0].Joints[JointType.HandLeft].Position.Y >
                            skeletons[0].Joints[JointType.HipCenter].Position.Y)
                        {
                            leftHandRaise = true;
                        }

                        rightVector.X = (hr.X - er.X);
                        rightVector.Y = (hr.Y - er.Y);
                        leftVector.X  = (hl.X - el.X);
                        leftVector.Y  = (hl.Y - el.Y);
                    }
                    HandShapeModel handModel = null;
                    if (!isSkip)
                    {
                        //handModel = m_OpenCVController.FindHandPart(ref depthImg, out rightFront, out leftFront, headDepth - (int)CullingThresh, rightVector, leftVector,leftHandRaise);
                    }



                    // no hands detected
                    if (handModel == null)
                    {
                        handModel = new HandShapeModel(0, HandEnum.None);
                    }
                    //sw.Restart();

                    // database processing
                    DBManager db = DBManager.GetSingleton();
                    if (db != null)
                    {
                        if (skeletons != null)
                        {
                            handModel.SetSkeletonData(skeletons[0]);
                        }
                        db.AddFrameData(handModel);
                    }
                    // not recording show prob
                    else
                    {
                        //Image<Bgr, byte>[] result = HandShapeClassifier.GetSingleton()
                        //.RecognizeGesture(handModel.hogRight, 3);
                        ////Console.WriteLine(sw.ElapsedMilliseconds);
                        //if (result != null)
                        //{
                        //    ImageConverter.UpdateWriteBMP(WrtBMP_Candidate1, result[0].Convert<Gray, byte>().ToBitmap());
                        //    ImageConverter.UpdateWriteBMP(WrtBMP_Candidate2, result[1].Convert<Gray, byte>().ToBitmap());
                        //    ImageConverter.UpdateWriteBMP(WrtBMP_Candidate3, result[2].Convert<Gray, byte>().ToBitmap());
                        //}
                    }
                    string currentSign = db == null ? "0" : db.CurrentSign.ToString();
                    string path        = @"J:\Kinect data\Aaron 141-180\hands\" + currentSign + " " + handModel.frame.ToString();
                    // UI update
                    if (rightFront != null)
                    {
                        Bitmap right = rightFront.ToBitmap();
                        //right.Save(path + " r.jpg");
                        ImageConverter.UpdateWriteBMP(WrtBMP_RightHandFront, right);
                    }
                    if (leftFront != null)
                    {
                        Bitmap left = leftFront.ToBitmap();
                        //left.Save(path + " l.jpg");
                        ImageConverter.UpdateWriteBMP(WrtBMP_LeftHandFront, left);
                    }
                    if (sw.ElapsedMilliseconds > 15)
                    {
                        Console.WriteLine("Find hand:" + sw.ElapsedMilliseconds);
                    }
                    sw.Restart();

                    //**************************draw gray histogram
                    //Bitmap histo = m_OpenCVController.Histogram(depthImg);
                    //ImageConverter.UpdateWriteBMP(GrayWriteBitmap, histo);

                    //  draw hand position from kinect
                    // DrawHandPosition(depthBMP, rightHandPosition, System.Drawing.Brushes.Purple);

                    //*******************upadte UI
                    ImageConverter.UpdateWriteBMP(DepthWriteBitmap, depthImg.ToBitmap());
                    // Console.WriteLine("Update UI:" + sw.ElapsedMilliseconds);
                }
            }
        }