Example #1
0
        public Gesture(string name)
        {
            this.name = name;
            filepath = Gesture.ACTION_DIRECTORY + "\\" + name + ".action";
            Dictionary<string, string> headers = KinectFileUtils.GetRecordingFileHeaders(filepath);

            startPose = new Pose(headers["STARTPOSE"]);
            endPose = new Pose(headers["ENDPOSE"]);
            endPose.ScaleErrors(float.Parse(headers["ENDSCALAR"]));

            string[] td = headers["TRAININGDATA"].Split(',');
            foreach (string s in td)
            {
                trainingDataFrames.Add(KinectFileUtils.ReadSkeletonFromRecordingFile(ACTION_DIRECTORY + "\\" + s));
            }

            string[] errors = headers["ERRORS"].Split(',');
            torsoError = double.Parse(errors[0]);
            leftArmError = double.Parse(errors[1]);
            rightArmError = double.Parse(errors[2]);
            leftLegError = double.Parse(errors[3]);
            rightLegError = double.Parse(errors[4]);

            foreach (List<Skeleton> train in trainingDataFrames)
            {
                for (int i = 0; i < 3; i++)
                {
                    train.Add(train[train.Count - 1]);
                }
            }

            bestFrames = trainingDataFrames[0];
            dist = KinectFrameUtils.GetTotalDistTraveled(bestFrames);
        }
Example #2
0
 public Pose GetPoseOfFrame(int index)
 {
     Pose p = new Pose(bestFrames[index]);
     p.SetErrors(torsoError, leftArmError, rightArmError, leftLegError, rightLegError);
     return p;
 }
        /// <summary>
        /// Event handler for Kinect sensor's SkeletonFrameReady event
        /// </summary>
        /// <param name="sender">object sending the event</param>
        /// <param name="e">event arguments</param>
        private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            Skeleton[] skeletons = new Skeleton[0];

            using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
            {
                if (skeletonFrame != null)
                {
                    skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
                    skeletonFrame.CopySkeletonDataTo(skeletons);
                }
            }

            using (DrawingContext dc = this.drawingGroup.Open())
            {
                // Draw a transparent background to set the render size
                dc.DrawRectangle(Brushes.LightBlue, null, new Rect(0.0, 0.0, RenderWidth, RenderHeight));

                Pen oldPen = trackedBonePen;
                switch (dm)
                {
                    case DemoMode.POSE:
                        trackedBonePen = new Pen(Brushes.DarkGreen, 6);
                        this.DrawBonesAndJoints(currentPose.frame, dc);
                        break;
                    case DemoMode.ACTION:
                        if (actionFrameCount == currentAction.bestFrames.Count)
                        {
                            actionFrameCount = 0;
                        }
                        trackedBonePen = new Pen(Brushes.DarkGreen, 6);
                        this.DrawBonesAndJoints(currentAction.bestFrames.ElementAt(actionFrameCount), dc);
                        actionFrameCount++;
                        break;
                }
                trackedBonePen = oldPen;

                switch (cpm)
                {
                    case CompareMode.POSE:
                        foreach (Skeleton skel in skeletons)
                        {
                            if (skel.TrackingState == SkeletonTrackingState.Tracked)
                            {
                                this.DrawBonesAndJointsWithComparison(skel, currentPose, dc);
                                if (currentPose.MatchesSkeleton(skel, 1))
                                {
                                    critiquePose = false;
                                    coach.SayCorrect();
                                    ClearAll();
                                }

                                if (critiquePose)
                                {
                                    coach.SayPoseErrors(currentPose.GetSignificantErrors(skel, frontTransform));
                                    critiquePose = false;
                                }
                            }
                        }
                        break;
                    case CompareMode.CALIBRATE:
                        foreach (Skeleton skel in skeletons)
                        {
                            if (skel.TrackingState == SkeletonTrackingState.Tracked)
                            {
                                currentPose = new Pose("ready");
                                rotTransform = KinectFrameUtils.GetRotationMatrix(skel, currentPose.frame);
                                currentPose = new Pose("frontready");
                                frontTransform = KinectFrameUtils.GetRotationMatrix(skel, currentPose.frame);
                                currentPose = null;
                                coach.Speak("Rotational differences recorded");
                                cpm = CompareMode.NONE;
                            }
                        }
                        break;
                    case CompareMode.ACTION:
                        if (actionFrameCount >= currentAction.bestFrames.Count)
                        {
                            actionFrameCount = 0;
                        }
                        this.DrawBonesAndJointsWithComparison(actionFrames.ElementAt(actionFrameCount), currentAction.GetPoseOfFrame(actionFrameCount), dc);
                        actionFrameCount++;
                        break;
                    case CompareMode.SIMUL_ACTION:
                        if (actionFrameCount >= currentAction.bestFrames.Count)
                        {
                            actionFrameCount = 0;
                        }
                        trackedBonePen = new Pen(Brushes.DarkGreen, 6);
                        this.DrawBonesAndJoints(currentAction.bestFrames.ElementAt(actionFrameCount), dc);
                        trackedBonePen = new Pen(Brushes.DarkBlue, 6);
                        this.DrawBonesAndJointsWithComparison(actionFrames.ElementAt(actionFrameCount), currentAction.GetPoseOfFrame(actionFrameCount), dc);
                        actionFrameCount++;
                        break;
                    case CompareMode.NONE:
                        foreach (Skeleton skel in skeletons)
                        {
                            if (skel.TrackingState == SkeletonTrackingState.Tracked)
                            {

                                if (watchingAction)
                                {
                                    if (!actionStarted)
                                    {
                                        CheckActionStart(skel);
                                        this.DrawBonesAndJointsWithComparison(skel, currentAction.startPose, dc);
                                    }
                                    else
                                    {
                                        this.DrawBonesAndJoints(skel, dc);
                                        actionFrames.Add(skel);
                                        CheckActionEnd(skel);
                                    }
                                }
                                else
                                {
                                    RenderClippedEdges(skel, dc);
                                    this.DrawBonesAndJoints(skel, dc);
                                }
                            }
                        }
                        break;
                }
                this.drawingGroup.ClipGeometry = new RectangleGeometry(new Rect(0.0, 0.0, RenderWidth, RenderHeight));
            }
        }
        /// <summary>
        /// Compare the passed skeleton "skeleton" with the skeleton "compare" to get an error map, then draw bones according to pose and error
        /// </summary>
        /// <param name="skeleton"></param>
        /// <param name="compare"></param>
        /// <param name="drawingContext"></param>
        private void DrawBonesAndJointsWithComparison(Skeleton skeleton, Pose currentP, DrawingContext drawingContext)
        {
            Dictionary<JointType, double> errorMap = currentP.GetErrorMap(skeleton);

            // Render Torso
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.Head, JointType.ShoulderCenter, errorMap, currentP.torsoError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.ShoulderCenter, JointType.ShoulderLeft, errorMap, currentP.torsoError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.ShoulderCenter, JointType.ShoulderRight, errorMap, currentP.torsoError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.ShoulderCenter, JointType.Spine, errorMap, currentP.torsoError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.Spine, JointType.HipCenter, errorMap, currentP.torsoError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.HipCenter, JointType.HipLeft, errorMap, currentP.torsoError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.HipCenter, JointType.HipRight, errorMap, currentP.torsoError);

            // Left Arm
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.ShoulderLeft, JointType.ElbowLeft, errorMap, currentP.leftArmError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.ElbowLeft, JointType.WristLeft, errorMap, currentP.leftArmError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.WristLeft, JointType.HandLeft, errorMap, currentP.leftArmError);

            // Right Arm
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.ShoulderRight, JointType.ElbowRight, errorMap, currentP.rightArmError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.ElbowRight, JointType.WristRight, errorMap, currentP.rightArmError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.WristRight, JointType.HandRight, errorMap, currentP.rightArmError);

            // Left Leg
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.HipLeft, JointType.KneeLeft, errorMap, currentP.leftLegError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.KneeLeft, JointType.AnkleLeft, errorMap, currentP.leftLegError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.AnkleLeft, JointType.FootLeft, errorMap, currentP.leftLegError);

            // Right Leg
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.HipRight, JointType.KneeRight, errorMap, currentP.rightLegError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.KneeRight, JointType.AnkleRight, errorMap, currentP.rightLegError);
            this.CheckErrorAndDrawBone(skeleton, drawingContext, JointType.AnkleRight, JointType.FootRight, errorMap, currentP.rightLegError);

            // Sword (right handed)
            this.DrawSword(skeleton, drawingContext);

            // Render Joints
            foreach (Joint joint in skeleton.Joints)
            {
                drawingContext.DrawEllipse(this.trackedJointBrush, null, this.SkeletonPointToScreen(joint.Position), JointThickness, JointThickness);
            }
        }
        private void ClearAll()
        {
            signal.Text = "Ready";
            currentPose = null;
            currentAction = null;

            dm = DemoMode.NONE;
            cpm = CompareMode.NONE;

            watchingAction = false;
            actionStarted = false;
            actionFrames = new List<Skeleton>();
            actionFrameCount = 0;

            StopRecordingSkeleton();
        }
 private void CheckPose(string pose)
 {
     coach.Speak("Enter " + pose + " position");
     signal.Text = "Checking " + pose;
     currentPose = new Pose(pose);
     currentPose.ApplyTransform(rotTransform);
     cpm = CompareMode.POSE;
     correctBonePen = new Pen(Brushes.Green, 6);
 }
 private string getStringFromErrorType(Pose.ErrorType et)
 {
     switch (et)
     {
         case Pose.ErrorType.INSIDE: return "too far inside";
         case Pose.ErrorType.OUTSIDE: return "too far outside";
         case Pose.ErrorType.HIGH: return "too high";
         case Pose.ErrorType.LOW: return "too low";
         case Pose.ErrorType.FORWARD: return "too far forward";
         default: return "too far back";
     }
 }