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);
        }
Exemple #2
0
        // 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);
        }