private void OnButtonEndRecordClick(object sender, EventArgs e)
        {
            _main.FacesAvailable -= OnMainFacesAvailable;

            IsRecording = false;

            IsTraining = true;

            try
            {
                HelperFaces.TrainRecognizer();
            }
            finally
            {
                IsTraining = false;

                dgvFaces.DataSource = null;
                dgvFaces.DataSource = HelperFaces.Faces;
            }
        }
Exemple #2
0
        private void OnButtonLoadClick(object sender, EventArgs e)
        {
            string packagePath;

            using (var ofd = new OpenFileDialog())
            {
                ofd.AddExtension       = true;
                ofd.AutoUpgradeEnabled = true;
                ofd.CheckPathExists    = true;
                ofd.DefaultExt         = ".fr";
                ofd.Filter             = "Face Recognition (*.fr)|*fr";

                if (ofd.ShowDialog() != DialogResult.OK)
                {
                    return;
                }

                packagePath = ofd.FileName;
            }

            HelperFaces.Load(packagePath);
        }
        private void OnButtonSaveClick(object sender, EventArgs e)
        {
            string packagePath = string.Empty;

            using (var sfd = new SaveFileDialog())
            {
                sfd.AddExtension       = true;
                sfd.AutoUpgradeEnabled = true;
                sfd.CheckPathExists    = true;
                sfd.DefaultExt         = ".fr";
                sfd.Filter             = "Face Recognition (*.fr)|*fr";

                if (sfd.ShowDialog() != DialogResult.OK)
                {
                    return;
                }

                packagePath = sfd.FileName;
            }

            HelperFaces.Save(packagePath);
        }
        private void ProcessFrame()
        {
            while (_captureContinue)
            {
                while (_processQueueLength != 2)
                {
                    Thread.Sleep(SleepInterval);
                }

                if ((Helper2D.FilterInstances.Mode == Mode.Cpu && useGpuMenuItem.Checked) ||
                    (Helper2D.FilterInstances.Mode == Mode.Gpu && useGpuMenuItem.Checked == false))
                {
                    Helper2D.FilterInstances = new FilterInstances(useGpuMenuItem.Checked ? Mode.Gpu : Mode.Cpu);
                }

                double distance;

                if (_cameras[0].FaceRegions == null ||
                    _cameras[1].FaceRegions == null)
                {
                    _resetCorrelation = true;
                }

                if (_resetCorrelation == false)
                {
                    #region Find correlation with previous face regions

                    // iterate through all cameras and track faces
                    foreach (Camera camera in _cameras)
                    {
                        var newRawFaceRegions = new List <FaceRegion2D>();

                        // iterate through every face found previously, rotate image and find faces
                        foreach (FaceRegion2D faceRegion in camera.FaceRegions)
                        {
                            Image <Bgr, byte> image = camera.Image.Rotate(faceRegion.EyeAngle,
                                                                          new PointF(faceRegion.Face.Location.X + faceRegion.Face.Width / 2, faceRegion.Face.Location.Y + faceRegion.Face.Height / 2),
                                                                          INTER.CV_INTER_CUBIC, _rotateBackground, true);

                            if (_debugRotation)
                            {
                                camera.Image = image;
                            }

                            // find faces in rotated image
                            newRawFaceRegions.AddRange(Helper2D.GetFaceRegion2Ds(image, FaceWidth, FaceHeight, true, false));
                        }

                        // find best corespondence between old faces and new faces
                        IEnumerable <Tuple <int, int> > corespondences = Helper.FindCorespondence
                                                                             (camera.FaceRegions.Select(item => item.Face.Location).ToArray(),
                                                                             newRawFaceRegions.Select(item => item.Face.Location).ToArray(),
                                                                             out distance);

                        if (corespondences == null ||
                            corespondences.Any() == false)
                        {
                            // face regions lost .. RESET both cameras
                            _resetCorrelation = true;
                            break;
                        }

                        var newFaceRegions = new FaceRegion2D[corespondences.Count()];

                        for (int i = 0; i < corespondences.Count(); i++)
                        {
                            FaceRegion2D faceRegion = newRawFaceRegions.ElementAt(corespondences.ElementAt(i).Item2);

                            faceRegion.SetHistory(camera.FaceRegions.ElementAt(corespondences.ElementAt(i).Item1));

                            newFaceRegions[i] = faceRegion;
                        }

                        camera.FaceRegions = newFaceRegions;
                    }

                    #endregion
                }

                if (_resetCorrelation)
                {
                    #region Reset Found Faces

                    foreach (Camera camera in _cameras)
                    {
                        camera.FaceRegions = Helper2D.GetFaceRegion2Ds(camera.Image, FaceWidth, FaceHeight, true, false);
                    }

                    #endregion
                }

                if (_cameras[0].FaceRegions.Length > 0 &&
                    _cameras[1].FaceRegions.Length > 0)
                {
                    #region Find correlation in stereo images and add history

                    IEnumerable <Point>[] points = _cameras.Select(camera => camera.FaceRegions.
                                                                   Select(region => region.Face.Location)).ToArray();

                    List <Tuple <int, int> > correlations = Helper.FindCorespondence(points.ElementAt(0), points.ElementAt(1), out distance).ToList();


                    // images have incorect correlations and history
                    if (_resetCorrelation == false &&
                        correlations.Any(item => _cameras[0].FaceRegions.ElementAt(item.Item1).Id != _cameras[1].FaceRegions.ElementAt(item.Item2).Id))
                    {
                        _resetCorrelation = true;
                    }

                    if (_resetCorrelation)
                    {
                        // assign faces color and Id
                        foreach (var correlation in correlations)
                        {
                            var color = new Bgr(_random.NextDouble() * 255, _random.NextDouble() * 255, _random.NextDouble() * 255);

                            FaceRegion2D leftFaceRegion  = _cameras[0].FaceRegions.ElementAt(correlation.Item1);
                            FaceRegion2D rightFaceRegion = _cameras[1].FaceRegions.ElementAt(correlation.Item2);

                            rightFaceRegion.Id = leftFaceRegion.Id;

                            leftFaceRegion.BoundingBoxColor  = color;
                            rightFaceRegion.BoundingBoxColor = color;
                        }
                    }

                    #endregion

                    #region Recognize Faces

                    _cameras.ForEach(camera =>
                    {
                        if (camera.FaceRegions != null)
                        {
                            camera.FaceRegions.ToList().ForEach(faceRegion =>
                            {
                                Helper.DrawFaceRegionCircle(camera.Image, faceRegion, faceRegion.BoundingBoxColor);

                                string label = HelperFaces.Recognize(faceRegion.FaceImage);

                                camera.Image.Draw(string.Format("{0}", label),
                                                  ref _font, faceRegion.Face.Location, new Bgr(0, 0, 255));
                            });
                        }
                    });

                    #endregion

                    EventHandler <FaceRegionsEventArgs> facesAvailableHandler = FacesAvailable;
                    if (facesAvailableHandler != null)
                    {
                        facesAvailableHandler(this, new FaceRegionsEventArgs(_cameras[0].FaceRegions, _cameras[1].FaceRegions, null));
                    }

                    _faces = _cameras.SelectMany(camera => camera.FaceRegions).Select(item => item.FaceImage).ToArray();
                }

                _resetCorrelation = false;

                PostProcess();

                lock (this)
                {
                    _processQueueLength = 0;
                }
            }
        }