/// <summary> /// Face detection based on haar cascade and Viola-Jones algorithm /// </summary> /// <param name="ImageFrame">The image from which to extract /// the face</param> /// <returns>A rectangle that defines the region of interess</returns> public Rectangle detectFace(Image <Bgr, Byte> ImageFrame) { InitParams(); Rectangle roi = Rectangle.Empty; if (ImageFrame != null) { Image <Gray, Byte> grayframe = ImageFrame.Convert <Gray, Byte>().Copy(); Rectangle[] faces = HaarCascade.DetectMultiScale(grayframe, ScaleFactor, MinNeighbors, MinSize, MaxSize); foreach (Rectangle face in faces) { roi = face; } } return(roi); }
//Есть утечки памяти private void FindFaces_Click(object sender, RoutedEventArgs e) { TaskItem taskItem = null; taskItem = new TaskItem("Поиск лиц на фотографии", false, () => { Image <Bgr, Byte> image = selectedImages[currentPreviewImage].Copy(); using (UMat ugray = new UMat()) { CvInvoke.CvtColor(image, ugray, ColorConversion.Bgr2Gray); CvInvoke.EqualizeHist(ugray, ugray); List <System.Drawing.Rectangle> Faces = new List <System.Drawing.Rectangle>(); Faces.AddRange(HaarCascade.DetectMultiScale(ugray, 1.1, 10, new System.Drawing.Size(20, 20))); foreach (var face in Faces) { image.Draw(face, new Bgr(0, 0, 255), 3); if (PeopleData.Face.Count() != 0) { var result = FaceRecognizer.Predict(ugray.ToImage <Gray, Byte>().Copy(face).Resize(100, 100, Inter.Cubic)); if (result.Label > 0 && result.Distance <= 100) { image.Draw(PeopleData.Name[result.Label - 1], new System.Drawing.Point(face.X, face.Y - 10), FontFace.HersheyComplex, 0.8, new Bgr(0, 0, 255)); } } } } selectedImages[currentPreviewImage] = image.Copy(); Dispatcher.Invoke(() => { SetImagePreview(currentPreviewImage); taskItem.Remove(); }); }); TaskList.Items.Add(taskItem); }
private void ProcessVideo_Click(object sender, RoutedEventArgs e) { if (selectedVideos.Count() == 0 || lockProcessVideo) { return; } lockProcessVideo = true; TaskItem taskItem = null; taskItem = new TaskItem("Поиск лиц на видеозаписи(" + System.IO.Path.GetFileName(selectedVideos[currentVideo]) + ")", false, () => { string path = selectedVideos[currentVideo]; int processedVideoIndex = currentVideo; VideoCapture videoReader = new VideoCapture(path); int fourcc = Convert.ToInt32(videoReader.GetCaptureProperty(CapProp.FourCC)); int fps = Convert.ToInt32(videoReader.GetCaptureProperty(CapProp.Fps)); int width = Convert.ToInt32(videoReader.GetCaptureProperty(CapProp.FrameWidth)); int heigth = Convert.ToInt32(videoReader.GetCaptureProperty(CapProp.FrameHeight)); int framecount = (int)Math.Floor(videoReader.GetCaptureProperty(CapProp.FrameCount)); string writePath = Environment.CurrentDirectory + "\\video" + currentVideo + System.IO.Path.GetExtension(path); if (File.Exists(writePath)) { File.Delete(writePath); } VideoWriter videoWriter = new VideoWriter(writePath, fourcc, fps, new System.Drawing.Size(width, heigth), true); List <System.Drawing.Rectangle> Faces = new List <System.Drawing.Rectangle>(); List <string> Names = new List <string>(); Mat mat = new Mat(); int frameNumber = 0; while (frameNumber < framecount) { videoReader.Read(mat); Image <Bgr, Byte> image = mat.ToImage <Bgr, Byte>(); if (frameNumber % 100 == 0) { int value = (int)(((double)frameNumber / (double)framecount) * 100); Dispatcher.Invoke(() => { taskItem.SetProgress(value); }); } if (frameNumber % 5 == 0) { using (UMat ugray = new UMat()) { CvInvoke.CvtColor(image, ugray, ColorConversion.Bgr2Gray); CvInvoke.EqualizeHist(ugray, ugray); Names.Clear(); Faces.Clear(); Faces.AddRange(HaarCascade.DetectMultiScale(ugray, 1.1, 10, new System.Drawing.Size(20, 20))); int recognizeCount = 0; foreach (var face in Faces) { image.Draw(face, new Bgr(0, 0, 255), 3); if (PeopleData.Face.Count() != 0) { var result = FaceRecognizer.Predict(ugray.ToImage <Gray, Byte>().Copy(face).Resize(100, 100, Inter.Cubic)); if (result.Label > 0 && result.Distance <= 100) { recognizeCount++; string name = PeopleData.Name[result.Label - 1]; Names.Add(name); image.Draw(name, new System.Drawing.Point(face.X, face.Y - 10), FontFace.HersheyComplex, 0.8, new Bgr(0, 0, 255)); } else { Names.Add(""); } } } } } else { int i = 0; foreach (var face in Faces) { image.Draw(face, new Bgr(0, 0, 255), 3); if (Names.Count() > 0) { image.Draw(Names[i], new System.Drawing.Point(face.X, face.Y - 10), FontFace.HersheyComplex, 0.8, new Bgr(0, 0, 255)); i++; } } } videoWriter.Write(image.Mat); image.Dispose(); frameNumber++; } if (videoWriter.IsOpened) { videoWriter.Dispose(); } if (videoReader.IsOpened) { videoReader.Dispose(); } Dispatcher.Invoke(() => { selectedVideos[processedVideoIndex] = writePath; bool isActive = ((VideoItem)VideoList.Children[processedVideoIndex]).IsActive(); if (isActive && isPlaying) { VideoPlayer.Pause(); VideoTimer.Stop(); StartStopVideoButton.Content = "➤"; } ((VideoItem)VideoList.Children[processedVideoIndex]).Refresh(this, writePath); ((VideoItem)VideoList.Children[processedVideoIndex]).VideoBorder(isActive); //VideoList.Children[processedVideoIndex]. processedVideos.Add(selectedVideos[processedVideoIndex]); //GetLoadVideos(selectedVideos.ToArray()); lockProcessVideo = false; taskItem.Remove(); }); }); TaskList.Items.Add(taskItem); }
//Есть небольшие утечки памяти private void GetLoadFaces(string[] files) { if (lockLoadFaces) { return; } lockLoadFaces = true; TaskItem taskItem = null; taskItem = new TaskItem("Получение лиц с фотографий", false, () => { if (files == null) { return; } ImageSourceConverter converter = new ImageSourceConverter(); List <string> correctFiles = new List <string>(); for (int i = 0; i < files.Count(); i++) { if (converter.IsValid(files[i])) { correctFiles.Add(files[i]); } } if (correctFiles.Count < 0) { return; } List <Image <Bgr, Byte> > findImages = new List <Image <Bgr, byte> >(); foreach (string file in correctFiles) { findImages.Add(new Image <Bgr, byte>(file)); } if (findImages.Count < 0) { return; } List <Image <Bgr, Byte> > findFaces = new List <Image <Bgr, byte> >(); foreach (var img in findImages) { using (UMat ugray = new UMat()) { CvInvoke.CvtColor(img, ugray, ColorConversion.Bgr2Gray); CvInvoke.EqualizeHist(ugray, ugray); var rects = HaarCascade.DetectMultiScale(ugray, 1.1, 10, new System.Drawing.Size(20, 20)); foreach (var rect in rects) { findFaces.Add(img.Copy(rect)); } } } if (findFaces.Count < 0) { return; } selectedFaces = new List <Image <Bgr, byte> >(findFaces); Dispatcher.Invoke(() => { SelectedFaceCount.Content = "Всего выбрано: " + selectedFaces.Count(); }); currentFace = 0; SetImageFace(currentFace); Dispatcher.Invoke(() => { taskItem.Remove(); }); lockLoadFaces = false; }); TaskList.Items.Add(taskItem); }