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); }
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"; } }