Skip to content
Snippets Groups Projects
Commit 2ed9834e authored by Alexis Iakovenko's avatar Alexis Iakovenko
Browse files

Prepare structure for mean and variance computation

parent 4062294a
Branches
No related tags found
No related merge requests found
......@@ -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";
}
......
......@@ -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 ();
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment