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; } }
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; } } }