Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        //Есть утечки памяти
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        //Есть небольшие утечки памяти
        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);
        }