コード例 #1
0
        /// <summary>
        /// Function of initialisation : launch every functions to have all needed data for emotionRecognition
        /// </summary>
        public static void init()
        {
            StreamReader sr = new StreamReader(nameForDb, Encoding.Default);
            //Count the exact number of lines the database
            int    i    = 0;
            string buff = "a";

            while (buff != null)
            {
                buff = sr.ReadLine();
                if (buff == null)
                {
                    break;
                }
                else
                {
                    i++;
                }
            }

            //Try to load files with data (path, numberOfLines)
            dataParsed = new Parsing(nameForDb, i);

            //Catch results of eigenFace
            if (dimension == 2)
            {
                eigen = new EigenFace(dataParsed.data);
            }

            else if (dimension == 3)
            {
                eigen = new EigenFace3D(dataParsed.data);
            }

            else
            {
                throw new System.InvalidOperationException("Problem of dimension in FaceRecognizer");
            }
        }
コード例 #2
0
        /// <summary>
        /// Provide the emotion of the nearest face of the current face get with the kinect
        /// </summary>
        ///
        /// <param name="skeletonFaceTracker">SkeletonFaceTracker</param>
        public static void recognizer(SkeletonFaceTracker skeletonFaceTracker)
        {
            EigenMethod eigenToRec = null;

            if (dimension == 3)
            {
                //Get all needed date from the 3D set of points : eigenValues and distances between each faces
                eigenToRec = new EigenFace3D(skeletonFaceTracker.facePoints3D);
            }
            else if (dimension == 2)
            {
                //Get all needed date from the 2D set of points : eigenValues and distances between each faces
                eigenToRec = new EigenFace(skeletonFaceTracker.facePoints);
            }

            //For each variable whose name contains "espilon" we work on [i,j] with 0 <= i,j <= 3 corresponding to the coordinates of the 3 eigenVectors we chose to keep

            //Calculate the nearest face
            double minI   = -1;
            int    indice = -1;

            for (int i = 0; i < eigen.epsilon.GetLength(1); i++)
            {
                if (minI == -1)
                {
                    minI   = (Math.Sqrt(Math.Pow(eigenToRec.vEpsilon[0, 0] - eigen.epsilon[0, 0], 2) + Math.Pow(eigenToRec.vEpsilon[1, 0] - eigen.epsilon[1, 0], 2) + Math.Pow(eigenToRec.vEpsilon[2, 0] - eigen.epsilon[2, 0], 2)));
                    indice = i;
                }
                else
                {
                    if (minI > (Math.Sqrt(Math.Pow(eigenToRec.vEpsilon[0, 0] - eigen.epsilon[0, i], 2) + Math.Pow(eigenToRec.vEpsilon[1, 0] - eigen.epsilon[1, i], 2) + Math.Pow(eigenToRec.vEpsilon[2, 0] - eigen.epsilon[2, i], 2))))
                    {
                        minI   = (Math.Sqrt(Math.Pow(eigenToRec.vEpsilon[0, 0] - eigen.epsilon[0, i], 2) + Math.Pow(eigenToRec.vEpsilon[1, 0] - eigen.epsilon[1, i], 2) + Math.Pow(eigenToRec.vEpsilon[2, 0] - eigen.epsilon[2, i], 2)));
                        indice = i;
                    }
                }
            }
            //calculate the nearest face according only to the mouth
            double min     = -1;
            int    indiceM = -1;

            for (int i = 1; i < eigen.epsilonM.GetLength(1); i++)
            {
                if (min == -1)
                {
                    min     = (Math.Sqrt(Math.Pow(eigenToRec.vEpsilonM[0, 0] - eigen.epsilonM[0, 0], 2) + Math.Pow(eigenToRec.vEpsilonM[1, 0] - eigen.epsilonM[1, 0], 2) + Math.Pow(eigenToRec.vEpsilonM[2, 0] - eigen.epsilonM[2, 0], 2)));
                    indiceM = i;
                }
                else
                {
                    if (min > (Math.Sqrt(Math.Pow(eigenToRec.vEpsilonM[0, 0] - eigen.epsilonM[0, i], 2) + Math.Pow(eigenToRec.vEpsilonM[1, 0] - eigen.epsilonM[1, i], 2) + Math.Pow(eigenToRec.vEpsilonM[2, 0] - eigen.epsilonM[2, i], 2))))
                    {
                        min     = (Math.Sqrt(Math.Pow(eigenToRec.vEpsilonM[0, 0] - eigen.epsilonM[0, i], 2) + Math.Pow(eigenToRec.vEpsilonM[1, 0] - eigen.epsilonM[1, i], 2) + Math.Pow(eigenToRec.vEpsilonM[2, 0] - eigen.epsilonM[2, i], 2)));
                        indiceM = i;
                    }
                }
            }
            //calculate the nearest face according only to the left eye
            min = -1;
            int indiceEyeL = -1;

            for (int i = 1; i < eigen.epsilonEyeL.GetLength(1); i++)
            {
                if (min == -1)
                {
                    min        = (Math.Sqrt(Math.Pow(eigenToRec.vEpsilonEyeL[0, 0] - eigen.epsilonEyeL[0, 0], 2) + Math.Pow(eigenToRec.vEpsilonEyeL[1, 0] - eigen.epsilonEyeL[1, 0], 2) + Math.Pow(eigenToRec.vEpsilonEyeL[2, 0] - eigen.epsilonEyeL[2, 0], 2)));
                    indiceEyeL = i;
                }
                else
                {
                    if (min > (Math.Sqrt(Math.Pow(eigenToRec.vEpsilonEyeL[0, 0] - eigen.epsilonEyeL[0, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeL[1, 0] - eigen.epsilonEyeL[1, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeL[2, 0] - eigen.epsilonEyeL[2, i], 2))))
                    {
                        min        = (Math.Sqrt(Math.Pow(eigenToRec.vEpsilonEyeL[0, 0] - eigen.epsilonEyeL[0, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeL[1, 0] - eigen.epsilonEyeL[1, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeL[2, 0] - eigen.epsilonEyeL[2, i], 2)));
                        indiceEyeL = i;
                    }
                }
            }
            //calculate the nearest face according only to the right eye
            min = -1;
            int indiceEyeR = -1;

            for (int i = 1; i < eigen.epsilonEyeR.GetLength(1); i++)
            {
                if (min == -1)
                {
                    min        = (Math.Sqrt(Math.Pow(eigenToRec.vEpsilonEyeR[0, 0] - eigen.epsilonEyeR[0, 0], 2) + Math.Pow(eigenToRec.vEpsilonEyeR[1, 0] - eigen.epsilonEyeR[1, 0], 2) + Math.Pow(eigenToRec.vEpsilonEyeR[2, 0] - eigen.epsilonEyeR[2, 0], 2)));
                    indiceEyeR = i;
                }
                else
                {
                    if (min > (Math.Sqrt(Math.Pow(eigenToRec.vEpsilonEyeR[0, 0] - eigen.epsilonEyeR[0, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeR[1, 0] - eigen.epsilonEyeR[1, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeR[2, 0] - eigen.epsilonEyeR[2, i], 2))))
                    {
                        min        = (Math.Sqrt(Math.Pow(eigenToRec.vEpsilonEyeR[0, 0] - eigen.epsilonEyeR[0, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeR[1, 0] - eigen.epsilonEyeR[1, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeR[2, 0] - eigen.epsilonEyeR[2, i], 2)));
                        indiceEyeR = i;
                    }
                }
            }
            //calculate the nearest face according to all calculations above
            min = -1;
            int indiceAll = -1;

            for (int i = 1; i < eigen.epsilon.GetLength(1); i++)
            {
                if (min == -1)
                {
                    min       = (Math.Sqrt(Math.Pow(eigenToRec.vEpsilonM[0, 0] - eigen.epsilonM[0, 0], 2) + Math.Pow(eigenToRec.vEpsilonM[1, 0] - eigen.epsilonM[1, 0], 2) + Math.Pow(eigenToRec.vEpsilonM[2, 0] - eigen.epsilonM[2, 0], 2)));
                    indiceAll = i;
                }
                else
                {
                    if (min > (Math.Sqrt(Math.Pow(eigenToRec.vEpsilon[0, 0] - eigen.epsilonM[0, i], 2) + Math.Pow(eigenToRec.vEpsilon[1, 0] - eigen.epsilonM[1, i], 2) + Math.Pow(eigenToRec.vEpsilon[2, 0] - eigen.epsilonM[2, i], 2))) + Math.Sqrt(Math.Pow(eigenToRec.vEpsilonEyeL[0, 0] - eigen.epsilonEyeL[0, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeL[1, 0] - eigen.epsilonEyeL[1, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeL[2, 0] - eigen.epsilonEyeL[2, i], 2)) + Math.Sqrt(Math.Pow(eigenToRec.vEpsilonEyeR[0, 0] - eigen.epsilonEyeR[0, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeR[1, 0] - eigen.epsilonEyeR[1, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeR[2, 0] - eigen.epsilonEyeR[2, i], 2)))
                    {
                        min       = Math.Sqrt(Math.Pow(eigenToRec.vEpsilon[0, 0] - eigen.epsilonM[0, i], 2) + Math.Pow(eigenToRec.vEpsilon[1, 0] - eigen.epsilonM[1, i], 2) + Math.Pow(eigenToRec.vEpsilon[2, 0] - eigen.epsilonM[2, i], 2)) + Math.Sqrt(Math.Pow(eigenToRec.vEpsilonEyeL[0, 0] - eigen.epsilonEyeL[0, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeL[1, 0] - eigen.epsilonEyeL[1, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeL[2, 0] - eigen.epsilonEyeL[2, i], 2)) + Math.Sqrt(Math.Pow(eigenToRec.vEpsilonEyeR[0, 0] - eigen.epsilonEyeR[0, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeR[1, 0] - eigen.epsilonEyeR[1, i], 2) + Math.Pow(eigenToRec.vEpsilonEyeR[2, 0] - eigen.epsilonEyeR[2, i], 2));
                        indiceAll = i;
                    }
                }
            }
            int bestIndice = indice;

            if (min < minI)
            {
                bestIndice = indiceAll;
            }

            //the nearest emotion is updated
            nearest = dataParsed.emotions[bestIndice];
            emotionEvent(null, new EmotionEventArgs(nearest));
        }