예제 #1
0
        public FreeTypeSource(byte[] data)
        {
            Error err;

            if (_libraryHandle == IntPtr.Zero)
            {
                IntPtr libraryRef;
                err = FTNative.FT_Init_FreeType(out libraryRef);

                if (err != Error.Ok)
                {
                    throw new FreeTypeException(err);
                }

                _libraryHandle = libraryRef;
            }

            _memoryHandle = GCHandle.Alloc(data, GCHandleType.Pinned);

            IntPtr faceRef;

            err = FTNative.FT_New_Memory_Face(_libraryHandle, _memoryHandle.AddrOfPinnedObject(), data.Length, 0, out faceRef);

            if (err != Error.Ok)
            {
                throw new FreeTypeException(err);
            }

            _faceHandle = faceRef;
            _rec        = PInvokeHelper.PtrToStructure <FaceRec>(_faceHandle);
        }
예제 #2
0
        public static FacesRec JsonToFacesRec(string txt)
        {
            try
            {
                var jFacesRec = JObject.Parse(txt);
                var rec       = new FacesRec();
                rec.primary_gender  = StringToGender((string)jFacesRec["primary_gender"]);
                rec.majority_gender = StringToGender((string)jFacesRec["majority_gender"]);

                rec.faces = new List <FaceRec>();
                foreach (var jfaces in jFacesRec["objects"])
                {
                    var face = new FaceRec();
                    face.id     = StringToInt((string)jfaces["id"]);
                    face.age    = (int)StringToFloat((string)jfaces["age"]);
                    face.gender = StringToGender((string)jfaces["gender"]);
                    rec.faces.Add(face);
                }

                return(rec);
            }
            catch (Exception ex)
            {
                var newEx = new Exception("Invalid JSON data format returned for 'State'.", ex);
                throw newEx;
            }
        }
예제 #3
0
        private void Work(FaceRec fr)
        {
            fr.FrameGrabber(null, null);

            if (fr.Verification == "Verified")
            {
                IsVerified = true;
                Close();
            }
        }
예제 #4
0
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.Integration.WindowsFormsHost.EnableWindowsFormsInterop();
            FaceRec fr = new FaceRec(card);

            // fr.Dock = System.Windows.Forms.DockStyle.Fill;
            FaceRecognition.Child = fr;

            timer = new DispatcherTimer
                    (
                TimeSpan.FromMilliseconds(50),
                DispatcherPriority.ApplicationIdle,  // Or DispatcherPriority.SystemIdle
                (s, r) => Work(fr),
                Application.Current.Dispatcher
                    );
        }
예제 #5
0
        public bool GetMostRelevantUserInfo(out int age, out Gender gender)
        {
            ValidateIsBound();
            age    = 0;
            gender = Gender.Unknown;

            var    client       = new LookRestClient(_device, _port, _username, _password);
            string body         = null;
            var    responseCode = client.GetFaces(out body);

            Trace.TraceInformation("\nRaw JSON data:  {0}", body);

            FacesRec rec = JsonHelper.JsonToFacesRec(body);

            if (rec.faces.Count < 1)
            {
                return(false);
            }
            FaceRec primaryFace = null;

            foreach (var item in rec.faces)
            {
                if (primaryFace == null)
                {
                    primaryFace = item;
                    continue;
                }
                if (item.id < primaryFace.id)
                {
                    primaryFace = item;
                }
            }
            age    = primaryFace.age;
            gender = primaryFace.gender;

            return(responseCode == System.Net.HttpStatusCode.OK);
        }
예제 #6
0
        private static void TestPerformanceBig()
        {
            //Khoi tao 9 bo face recognizer
            Console.WriteLine("We will load a dumb training data with 600 images.");
            Console.Write("Press Enter to begin: ");
            Console.ReadLine();
            FaceRecognizers = new List <FaceRecognizer>();
            FaceRecognizers.Add(new EigenFaceRecognizer(80, 2000));
            FaceRecognizers.Add(new EigenFaceRecognizer(80, 3500));
            FaceRecognizers.Add(new EigenFaceRecognizer(80, 5000));

            FaceRecognizers.Add(new FisherFaceRecognizer(80, 500));
            FaceRecognizers.Add(new FisherFaceRecognizer(80, 1000));
            FaceRecognizers.Add(new FisherFaceRecognizer(80, 1500));

            FaceRecognizers.Add(new LBPHFaceRecognizer(1, 8, 8, 9, 50));
            FaceRecognizers.Add(new LBPHFaceRecognizer(1, 8, 8, 9, 100));
            FaceRecognizers.Add(new LBPHFaceRecognizer(1, 8, 8, 9, 150));


            String TrainingDataFolderPath = @"C:\Users\Hoang\Documents\Visual Studio 2010\Projects\RollSystemMobile\FaceRecAutomationTesting\Training Datas\DumbTrainingData";
            //Bat dau tinh thoi gian add 600 tam hinh vao bo nho
            DateTime Start = DateTime.Now;

            List <Image <Gray, byte> > ImageList = new List <Image <Gray, byte> >();
            List <int> IDList = new List <int>();

            var FilePaths = Directory.GetFiles(TrainingDataFolderPath, "*.jpg", SearchOption.TopDirectoryOnly);

            foreach (var FilePath in FilePaths)
            {
                Image <Gray, byte> Image = new Image <Gray, byte>(FilePath);
                Image._EqualizeHist();
                ImageList.Add(Image);
                Console.WriteLine("\tLoad Images: " + FilePath);
                int ID = int.Parse(Path.GetFileNameWithoutExtension(FilePath)) / 20 + 1;
                IDList.Add(ID);
            }
            TimeSpan TimeDiff = DateTime.Now - Start;

            Console.WriteLine("Time to load 600 images to memory is: " + TimeDiff.TotalMilliseconds / 1000 + " seconds");


            Console.WriteLine("Now we will begin to train our face recognizer");
            Console.Write("Press Enter to continue: ");
            Console.ReadLine();
            Start = DateTime.Now;
            Image <Gray, byte>[] ImageArray = ImageList.ToArray();
            int[] IDArray = IDList.ToArray();
            int   i       = 1;

            foreach (var FaceRec in FaceRecognizers)
            {
                FaceRec.Train(ImageArray, IDArray);
                Console.WriteLine(i + " Recognizers Trained.");
                i++;
            }
            TimeDiff = DateTime.Now - Start;
            Console.WriteLine("Time to trains 9 recognizer is: " + TimeDiff.TotalMilliseconds / 1000 + " seconds");

            Console.WriteLine("Now we will test the recognizer performance. With a folder of 400 faces");
            Console.Write("Press Enter to continue: ");
            Console.ReadLine();

            String TestDataFolderPath = @"C:\Users\Hoang\Documents\Visual Studio 2010\Projects\RollSystemMobile\FaceRecAutomationTesting\TestData\Dump TestData";

            Console.WriteLine("Creating the list of test image");
            List <Image <Gray, byte> > TestImageList = new List <Image <Gray, byte> >();

            foreach (var FilePath in Directory.GetFiles(TestDataFolderPath, "*.jpg", SearchOption.TopDirectoryOnly))
            {
                Image <Gray, byte> Image = new Image <Gray, byte>(FilePath);
                Image._EqualizeHist();
                TestImageList.Add(Image);
            }

            foreach (var FaceRec in FaceRecognizers)
            {
                Console.WriteLine("Begin test with face recognizer: " + FaceRec.GetType().ToString());
                Start = DateTime.Now;
                i     = 1;
                foreach (var Image in TestImageList)
                {
                    FaceRec.Predict(Image);
                    Console.WriteLine("\tRecognized " + i + " images.");
                    i++;
                }
                TimeDiff = DateTime.Now - Start;
                Console.WriteLine("Time to recognize 200 images is: " + TimeDiff.TotalMilliseconds / 1000 + " seconds");
                Console.Write("Press Enter to continue: ");
                Console.ReadLine();
            }
        }
예제 #7
0
        private static void TestGenderRecognitionAccuracy(int NumberOfTrainingImage)
        {
            //Khoi tao 9 bo face recognizer
            FaceRecognizers = new List <FaceRecognizer>();
            FaceRecognizers.Add(new EigenFaceRecognizer(80, 2000));
            FaceRecognizers.Add(new EigenFaceRecognizer(80, 3500));
            //Can't recognize unknown
            FaceRecognizers.Add(new EigenFaceRecognizer(80, 8000));

            FaceRecognizers.Add(new FisherFaceRecognizer(80, 500));
            FaceRecognizers.Add(new FisherFaceRecognizer(80, 1000));
            //Can't recognize unknown
            FaceRecognizers.Add(new FisherFaceRecognizer(80, 2500));

            FaceRecognizers.Add(new LBPHFaceRecognizer(1, 8, 8, 9, 50));
            FaceRecognizers.Add(new LBPHFaceRecognizer(1, 8, 8, 9, 100));
            //Can't recognize unknown
            FaceRecognizers.Add(new LBPHFaceRecognizer(1, 8, 8, 9, 250));

            List <TestSingleResult> Results = new List <TestSingleResult>();


            Console.WriteLine("This time we will check the accuracy of the 3 algorithm.");
            Console.Write("Press Enter to continue: ");
            Console.ReadLine();
            NameList = new string[] { "Nam", "Nu" }.ToList();

            String TrainingDataPath = @"C:\Users\Hoang\Documents\Visual Studio 2010\Projects\RollSystemMobile\FaceRecAutomationTesting\Gender Recognition\Training Data";

            List <Image <Gray, byte> > TrainingImageList = new List <Image <Gray, byte> >();
            List <int> IDList = new List <int>();

            Console.WriteLine("Begin Training Face Recognizer");
            foreach (var FilePath in Directory.GetFiles(TrainingDataPath, "*.jpg", SearchOption.TopDirectoryOnly))
            {
                foreach (var PersonName in NameList)
                {
                    String ImageName = GetResult(FilePath);
                    int    ID        = NameList.IndexOf(ImageName);
                    if (ID != -1 && ImageName.Equals(PersonName) && IDList.Count(num => num == ID) < NumberOfTrainingImage)
                    {
                        Image <Gray, byte> Image = new Image <Gray, byte>(FilePath);
                        Image._EqualizeHist();
                        TrainingImageList.Add(Image);

                        IDList.Add(ID);
                    }
                }
            }

            foreach (var FaceRec in FaceRecognizers)
            {
                FaceRec.Train(TrainingImageList.ToArray(), IDList.ToArray());
            }

            Console.WriteLine(TrainingImageList.Count + " images loaded.");
            Console.Write("Press Enter to continue: ");
            Console.ReadLine();

            Console.WriteLine("Begin Testing Recognition:");
            String TestDataPath    = @"C:\Users\Hoang\Documents\Visual Studio 2010\Projects\RollSystemMobile\FaceRecAutomationTesting\Gender Recognition\Test Data";
            int    imageRecognized = 1;

            foreach (var FilePath in Directory.GetFiles(TestDataPath, "*.jpg", SearchOption.TopDirectoryOnly))
            {
                //Load hinh tu duong dan
                Image <Gray, byte> Face = new Image <Gray, byte>(FilePath);
                Face._EqualizeHist();

                //Lay result tu ten file
                TestSingleResult TestResult = new TestSingleResult();
                TestResult.Result = GetResult(FilePath);

                //Lay 9 ket qua tu eigen face, set vao object
                //Lay 9 properties cua result, tuong ung voi 9 bo face recognizer
                var Properties = TestResult.GetType().GetProperties();
                for (int i = 0; i < FaceRecognizers.Count; i++)
                {
                    FaceRecognizer.PredictionResult PR = FaceRecognizers.ElementAt(i).Predict(Face);
                    String NameFound = PR.Label == -1 ? "Unknown" : NameList.ElementAt(PR.Label);
                    Properties[i].SetValue(TestResult, NameFound, null);
                }
                //Dua result da tim dc vao danh sach, sau nay tinh tiep
                Results.Add(TestResult);
                Console.WriteLine(imageRecognized + " images recognized");
                imageRecognized++;
            }

            Console.Write("Completed. Enter path to export report: ");
            String ReportPath = Console.ReadLine();

            String MixedFilePath     = ReportPath + "Mixed.txt";
            String MixedResultString = GetResultString(Results);

            System.IO.File.WriteAllText(MixedFilePath, MixedResultString, Encoding.UTF8);

            String KnownFilePath     = ReportPath + "Known.txt";
            String KnownResultString = GetResultString(Results.Where(result => !result.Result.Equals("Unknown")).ToList());

            System.IO.File.WriteAllText(KnownFilePath, KnownResultString, Encoding.UTF8);

            String UnknownFilePath     = ReportPath + "Unknown.txt";
            String UnknownResultString = GetResultString(Results.Where(result => result.Result.Equals("Unknown")).ToList());

            System.IO.File.WriteAllText(UnknownFilePath, UnknownResultString, Encoding.UTF8);
            Console.Write("Done");
        }
예제 #8
0
        public bool buildFont()
        {
            int    error   = 0;
            IntPtr libptr  = IntPtr.Zero;
            IntPtr faceptr = IntPtr.Zero;

            error = FT.Init_FreeType(out libptr);
            if (error != 0)
            {
                System.Console.WriteLine("FT_Init_FreeType failed");
                return(false);
            }

            int[] maj   = new int[1];
            int[] min   = new int[1];
            int[] patch = new int[1];

            FT.Library_Version(libptr, maj, min, patch);
            System.Console.WriteLine("Freetype Version {0}.{1}.{2}", maj[0], min[0], patch[0]);

            error = FT.New_Face(libptr, myFilename, 0, out faceptr);
            if (error == FT.Err_Unknown_File_Format)
            {
                System.Console.WriteLine("FT_New_Face Failed: Unknown Font Format");
                return(false);
            }

            else if (error != 0)
            {
                System.Console.WriteLine("FT_New_Face Failed: Unknown Error: " + error);
                return(false);
            }

            //set the size of the Font in pixels
            error = FT.Set_Pixel_Sizes(faceptr, (uint)0, (uint)mySize);
            if (error != 0)
            {
                System.Console.WriteLine("FT_Set_Pixel_Sizes Failed: Unknown Error: " + error);
                return(false);
            }

            texture = new Texture(1024, 1024); //should be big enough for most sized fonts

            uint glyphIndex;
            uint asciiCounter;

            //only going to get ascii characters at this time
            //32 128
            for (asciiCounter = 32; asciiCounter < 128; asciiCounter++)
            {
                //get the character loaded
                glyphIndex = FT.Get_Char_Index(faceptr, asciiCounter);
                error      = FT.Load_Glyph(faceptr, glyphIndex, FT.LOAD_RENDER);
                if (error != 0)
                {
                    System.Console.WriteLine("FT_Load_Glyph Failed: Unknown Error: " + error);
                    return(false);
                }

                //copy to our Texture and update the myGlyph data structure
                FaceRec      f = (FaceRec)Marshal.PtrToStructure(faceptr, typeof(FaceRec));
                GlyphSlotRec g = (GlyphSlotRec)Marshal.PtrToStructure(f.glyph, typeof(GlyphSlotRec));

                addGlyph(g, (int)asciiCounter);
            }

            FT.Done_Face(faceptr);
            FT.Done_FreeType(libptr);

            return(true);
        }