Exemplo n.º 1
0
        static string saveAFace(Bitmap ImageFrame, string name)
        {
            var faceToSave = new Image <Gray, byte>(ImageFrame);

            Byte[]           file;
            IDataStoreAccess dataStore = new DataStoreAccess(_databasePath);

            var username = string.IsNullOrEmpty(name) ? Guid.NewGuid().ToString() : name;
            var filePath = Application.StartupPath + String.Format("/{0}.bmp", username);

            faceToSave.ToBitmap().Save(filePath);
            using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                using (var reader = new BinaryReader(stream))
                {
                    file = reader.ReadBytes((int)stream.Length);
                }
            }
            return(dataStore.SaveFace(username, file));
        }
Exemplo n.º 2
0
        void saveAFace(Rectangle face, Bitmap ImageFrame)
        {
            var faceToSave = new Image <Gray, byte>(ImageFrame);

            Byte[]           file;
            IDataStoreAccess dataStore = new DataStoreAccess(_databasePath);

            var username = Guid.NewGuid().ToString();
            var filePath = Application.StartupPath + String.Format("/{0}.bmp", username);

            faceToSave.ToBitmap().Save(filePath);
            using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                using (var reader = new BinaryReader(stream))
                {
                    file = reader.ReadBytes((int)stream.Length);
                }
            }
            var result = dataStore.SaveFace(username, file);

            bckGroundTrainer.RunWorkerAsync();
            MessageBox.Show(result, "Salvar resultado", MessageBoxButtons.OK);
        }
        void ProcessFrame(object sender, EventArgs arg)
        {
            //_cascadeClassifier = new CascadeClassifier(Application.StartupPath + "/haarcascade_frontalface_default.xml");

            using (ImageFrame = _capture.QueryFrame().ToImage <Bgr, byte>())
            {
                if (ImageFrame != null)
                {
                    var grayframe = ImageFrame.Convert <Gray, byte>();
                    var faces     = _cascadeClassifier.DetectMultiScale(grayframe, 1.1, 10, Size.Empty); //the actual face detection happens here
                    int faceIndex = 1;
                    foreach (var face in faces)
                    {
                        ImageFrame.Draw(face, new Bgr(Color.BurlyWood), 3); //the detected face(s) is highlighted here using a box that is drawn around it/them
                        int    predictedUserId;
                        Bitmap map = ImageFrame.Copy(face).Bitmap;
                        if (faceIndex == 1)
                        {
                            imageBox1.Image = new Image <Rgb, byte>(map);
                        }
                        else if (faceIndex == 2)
                        {
                            imageBox2.Image = new Image <Rgb, byte>(map);
                        }
                        else if (faceIndex == 3)
                        {
                            imageBox3.Image = new Image <Rgb, byte>(map);
                        }
                        faceIndex++;
                        try
                        {
                            predictedUserId = _recognizerEngine.RecognizeUser(new Image <Gray, byte>(map));
                            //Debug.WriteLine(predictedUserId);
                        }
                        catch { predictedUserId = -1; }
                        if (predictedUserId == -1)
                        {
                            saveAFace(face, map);
                        }
                        else
                        {
                            //proceed to documents library
                            IDataStoreAccess dataStore = new DataStoreAccess(_databasePath);
                            var username = dataStore.GetUsername(predictedUserId);
                            if (username != String.Empty)
                            {
                                lblUsername.Text =
                                    String.Format("{1} Face Recognized as {0}", username, faces.Length);
                            }
                            else
                            {
                                saveAFace(face, map);
                                //MessageBox.Show("No Username for this face, Kindly register this face", "Authentication Result",
                                //MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
                    }
                }

                imgCamUser.Image = ImageFrame; //line 2
            }                                  //line 1
        }
 public RecognizerEngine(String databasePath, String recognizerFilePath)
 {
     _recognizerFilePath = recognizerFilePath;
     _dataStoreAccess    = new DataStoreAccess(databasePath);
     _faceRecognizer     = new LBPHFaceRecognizer(threshold: 53); //currently put 53 with 200x200,last test 55 with 200x200 work ok with some bad rec, 78 with 100x100 work ok//should play little more with this number. >100 -> almost recognize all time         //new EigenFaceRecognizer(80, double.PositiveInfinity);
 }
Exemplo n.º 5
0
        public static Image <Bgr, Byte> RecognizeImage(Image img, Label msgout = null)
        {
            if (img == null)
            {
                return(null);
            }
            using (var ImageFrame = new Image <Bgr, Byte>(new Bitmap(img)))
            {
                var _recognizerEngine = new RecognizerEngine(_databasePath, _trainerDataPath);
                _recognizerEngine.TrainRecognizer();
                if (ImageFrame == null)
                {
                    System.Windows.Forms.MessageBox.Show("Nenhuma imagem fornecida.");
                }

                var grayframe = ImageFrame.Convert <Gray, byte>();

                var faces = _cascadeClassifier.DetectMultiScale(grayframe, 1.1, 10, Size.Empty); //the actual face detection happens here

                if (faces.Length == 0)
                {
                    System.Windows.Forms.MessageBox.Show("Ops! Nenhum rosto foi identifcado.\n\nCarrege uma imagem com boa definição, tirada de ângulo frontal.");
                }

                //int faceIndex = 1;
                var face = faces[0];

                ImageFrame.Draw(face, new Bgr(Color.BurlyWood), 3); //the detected face(s) is highlighted here using a box that is drawn around it/them

                int predictedUserId;

                Bitmap map = ImageFrame.Copy(face).Bitmap;

                try
                {
                    predictedUserId = _recognizerEngine.RecognizeUser(new Image <Gray, byte>(map));
                    //Debug.WriteLine(predictedUserId);
                }
                catch { predictedUserId = -1; }

                var username = "";

                if (predictedUserId != -1)
                {
                    //proceed to documents library
                    IDataStoreAccess dataStore = new DataStoreAccess(_databasePath);

                    username = dataStore.GetUsername(predictedUserId);
                }

                if (predictedUserId == -1 || username.Length == 0)
                {
                    msgout.Text      = "Atenção: usuário não identificado.";
                    msgout.ForeColor = System.Drawing.Color.Red;
                }
                else
                {
                    msgout.Text      = "Olá, " + username + "! Seu acesso está autorizado. :)";
                    msgout.ForeColor = System.Drawing.Color.Blue;
                    ImageFrame.Draw(username, new Point(face.X, face.Y), Emgu.CV.CvEnum.FontFace.HersheyPlain, 2, new Bgr(Color.Red), 2);
                }

                return(ImageFrame.Copy());
            }
        }
Exemplo n.º 6
0
        public static string TrainImage(Image img, string preName = "")
        {
            if (img == null)
            {
                return("");
            }
            using (var ImageFrame = new Image <Bgr, Byte>(new Bitmap(img)))
            {
                var _recognizerEngine = new RecognizerEngine(_databasePath, _trainerDataPath);

                if (ImageFrame == null)
                {
                    return(null);
                }

                var grayframe = ImageFrame.Convert <Gray, byte>();

                var faces = _cascadeClassifier.DetectMultiScale(grayframe, 1.1, 10, Size.Empty); //the actual face detection happens here

                //int faceIndex = 1;

                if (faces.Length == 0)
                {
                    throw new Exception("no_faces");
                }
                else if (faces.Length > 1)
                {
                    throw new Exception("multiple_faces");
                }

                List <string> names = new List <string>();

                foreach (var face in faces)
                {
                    ImageFrame.Draw(face, new Bgr(Color.BurlyWood), 3); //the detected face(s) is highlighted here using a box that is drawn around it/them
                    int    predictedUserId;
                    Bitmap map = ImageFrame.Copy(face).Bitmap;
                    try
                    {
                        predictedUserId = _recognizerEngine.RecognizeUser(new Image <Gray, byte>(map));
                        //Debug.WriteLine(predictedUserId);
                    }
                    catch { predictedUserId = -1; }
                    if (predictedUserId == -1)
                    {
                        string name = string.IsNullOrEmpty(preName) ? PromptForName("Identificação", "Identifique a pessoa", map) : preName;
                        saveAFace(map, name);
                        names.Add(name);
                    }
                    else
                    {
                        //proceed to documents library
                        IDataStoreAccess dataStore = new DataStoreAccess(_databasePath);
                        var username = dataStore.GetUsername(predictedUserId);
                        if (username != String.Empty)
                        {
                            if (preName != username)
                            {
                                string name = PromptForName("Identificação", "Identifique a pessoa", map, username);
                                if (name != username && name != preName)
                                {
                                    saveAFace(map, name);
                                }
                                names.Add(name);
                            }
                        }
                        else
                        {
                            string name = string.IsNullOrEmpty(preName) ? PromptForName("Identificação", "Insira o nome da pessoa", map) : preName;
                            saveAFace(map, name);
                            names.Add(name);
                        }
                    }
                }
                return(string.Join(",", names.ToArray().Where(v => v.Length > 0)));
            }
        }