public bool IsCorrectGesture(string gestureName, Body[] record) { GestureData gestureData = gestureIndex.GestureDB[gestureName]; List <string> files = new List <string>(); foreach (string s in Directory.EnumerateFiles(@"..\..\..\..\database\")) { if (s.Contains(gestureData.fileName)) { files.Add(s); } } DTWComputer computer = new DTWComputer(); float sum = 0; for (int i = 0; i < files.Count; i++) { sum = 0; BodyManager reference = new BodyManager(); reference.LoadBodyData(files[i]); computer.ComputeDTW(reference.RecordedDataAsArray, record); foreach (BoneName boneName in Enum.GetValues(typeof(BoneName))) { for (int k = 0; k < 4; k++) { sum += computer.Result.Data[Mapper.BoneIndexMap[boneName]].BestCost[k]; } } // we need a confidence threshold... getting the max difference between samples is not // the best solution... for now * 2 seems to work if (sum < gestureData.threshold * 2) { Console.WriteLine("correct gesture threshold: " + sum); closestSample = reference; return(true); } } Console.WriteLine("incorrect gesture threshold: " + sum); closestSample = new BodyManager(); closestSample.LoadBodyData(files[0]); return(false); }
// to refactor private float ComputeDTWThreshold() { float maxSum = 0; List <string> files = new List <string>(); foreach (string s in Directory.EnumerateFiles(@"..\..\..\..\database\")) { if (s.Contains(gestureDB[newGesture].fileName)) { files.Add(s); } } DTWComputer computer = new DTWComputer(); for (int i = 0; i < files.Count; i++) { BodyManager reference = new BodyManager(); reference.LoadBodyData(files[i]); for (int j = 0; j < files.Count; j++) { float sum = 0; FileStream recordFileStream = new FileStream(files[j], FileMode.Open, FileAccess.Read); BodyManager record = new BodyManager(); record.LoadBodyData(files[j]); computer.ComputeDTW(reference.RecordedDataAsArray, record.RecordedDataAsArray); foreach (BoneName boneName in Enum.GetValues(typeof(BoneName))) { for (int k = 0; k < 4; k++) { sum += computer.Result.Data[Mapper.BoneIndexMap[boneName]].BestCost[k]; } } if (sum > maxSum) { maxSum = sum; } } } maxSum *= 1.5f; Console.WriteLine("threshold will be " + maxSum); return(maxSum); }
private Body[] GetSelectedGestureSample() { try { string gestureName = (string)gestureList.SelectedItem; string gestureFileName = @"..\..\..\..\database\" + gestureIndex.GestureDB[gestureName].fileName + "0.xml"; // load the gesture BodyManager b = new BodyManager(); b.LoadBodyData(gestureFileName); return(b.RecordedDataAsArray); } catch (Exception ex) { Console.WriteLine(ex.Message); return(null); } }