From 2ed9834e6939b0a2b042867d8a4a720bb0abfafc Mon Sep 17 00:00:00 2001 From: Alexis Iakovenko <alexis.iakovenko@gmail.com> Date: Wed, 10 Jan 2018 16:58:47 +0100 Subject: [PATCH] Prepare structure for mean and variance computation --- Assets/Gesture/Gesture.cs | 113 ++++++++------------------------------ Assets/Replay/Replay.cs | 2 +- 2 files changed, 23 insertions(+), 92 deletions(-) diff --git a/Assets/Gesture/Gesture.cs b/Assets/Gesture/Gesture.cs index 7fd8b28..a439190 100644 --- a/Assets/Gesture/Gesture.cs +++ b/Assets/Gesture/Gesture.cs @@ -5,6 +5,8 @@ using System.IO; public class Gesture { + public enum GestureType {Normal, Mean, Variance}; + static string directoryPath = "Assets/Record/Recorded/"; public List<GestureState> states; string name; @@ -14,116 +16,45 @@ public class Gesture states = new List<GestureState> (); } - public Gesture(string name) + public Gesture (string name, GestureType type = GestureType.Normal) { this.name = name; - Load (); - //VerifyNormalization (); - Normalize (); - //VerifyNormalization (); + if (type == GestureType.Normal) + Load (); + else if (type == GestureType.Mean) + ComputeMean (); + else if (type == GestureType.Variance) + ComputeVariance (); } - public void Normalize () + void ComputeMean () { - //set 0 as origin/centroid - //find mean position - Vector3 meanPosition = new Vector3(0, 0, 0); - foreach (GestureState state in states) - meanPosition += state.position; - meanPosition /= states.Count; - - //subtract mean position to all positions - foreach (GestureState state in states) - state.position -= meanPosition; - - //have furthest point have distance 1 - //find furthest point length - float furthestDistance = 0; - foreach (GestureState state in states) - { - float length = state.position.magnitude; - if (length > furthestDistance) - furthestDistance = length; - } - - //divide length to all points - foreach (GestureState state in states) - state.position /= furthestDistance; - - - //time normalization: have 100 points. - int pointNumber = 100; - float timeNormalizationFactor = pointNumber * 1.0f / states.Count; - Debug.Log ("Time normalization, factor: " + timeNormalizationFactor); - List<GestureState> normalizedStates = new List<GestureState>(); - - float timestampStep = (states [states.Count - 1].timestamp - states [0].timestamp) / (states.Count - 1); - float normalizedTimestamp = states [0].timestamp; - for (int i = 0; i < pointNumber; i++) + //find and load gestures to compare for the mean + List<Gesture> gesturesToMean = new List<Gesture> (); + string path = "Assets/Record/Recorded/" + name + "/"; + foreach (string gesturePath in Directory.GetDirectories (path)) { - GestureState normalizedState = new GestureState (); - - int stateID = (int)Mathf.Floor(i / timeNormalizationFactor); - GestureState currentState = states [stateID]; - Vector3 normalizedPosition = states [stateID].position; - Vector3 normalizedRotation = states [stateID].rotation; - - if (stateID > 0 && stateID < states.Count - 1) + if (!gesturePath.Equals (path + "mean.txt") && !gesturePath.Equals (path + "variance.txt")) { - GestureState nextState = states [stateID + 1]; - float smallTimestamp = (normalizedTimestamp - currentState.timestamp); - if (smallTimestamp != 0) - { - float smallFactor = (nextState.timestamp - currentState.timestamp) / smallTimestamp; - - Vector3 positionToNextState = nextState.position - currentState.position; - normalizedPosition = currentState.position + positionToNextState * smallFactor; - - Vector4 rotationToNextState = nextState.rotation - currentState.rotation; - normalizedRotation = currentState.rotation + rotationToNextState * smallFactor; - } + Gesture gesture = new Gesture(gesturePath); + gesture.Load (); + gesturesToMean.Add(gesture); } - - normalizedState.position = normalizedPosition; - normalizedState.rotation = normalizedRotation; - normalizedState.timestamp = normalizedTimestamp; - normalizedStates.Add (normalizedState); - - normalizedTimestamp += timestampStep; - - //Debug.Log ("i: " + i + ", state id: " + stateID + " of " + states.Count); - //Debug.Log ("currentstate T: " + currentState.timestamp + ", pos: " + currentState.position); - //Debug.Log ("normstate T: " + normalizedState.timestamp + ", pos: " + normalizedState.position); } - states = normalizedStates; - //Debug.Log ("Time normalization done\n"); + //compute the mean } - public void VerifyNormalization () + void ComputeVariance () { - Vector3 meanPosition = new Vector3(0, 0, 0); - foreach (GestureState state in states) - meanPosition += state.position; - meanPosition /= states.Count; - Debug.Log ("[VerifyNormalization] mean position: " + meanPosition); - - float furthestDistance = -1; - foreach (GestureState state in states) - { - float length = state.position.sqrMagnitude; - if (length > furthestDistance) - furthestDistance = length; - } - Debug.Log ("[VerifyNormalization] furthestDistance: " + furthestDistance); } - public void Load() + public void Load () { states = GestureLoader.Load (FullPath ()); } - private string FullPath() + private string FullPath () { return directoryPath + name + ".txt"; } diff --git a/Assets/Replay/Replay.cs b/Assets/Replay/Replay.cs index 5857d79..d53a938 100644 --- a/Assets/Replay/Replay.cs +++ b/Assets/Replay/Replay.cs @@ -46,7 +46,7 @@ public class Replay: MonoBehaviour public void UpdateSelectedGesture(int id) { - gestureToReplay = new Gesture (replays[id] + "/0"); + gestureToReplay = new Gesture (replays[id], Gesture.GestureType.Mean); currentFrame = 0; ApplyCurrentFrameToModel (); } -- GitLab