Как использовать EmguCV для обнаружения лица из кадра AForge в WPF? - PullRequest
0 голосов
/ 28 марта 2020

Я не могу найти твердый ответ / учебник / пример по использованию EmguCV вместе с AForge NewFrame. Я пробовал и Emgu из Nuget, и из справочника DLL, и результат определения лица все еще не может быть успешным.

Версия: -

  • AForge [Nuget] - V2.2.5
  • EmguCV [Установка] - emgucv- windows -x86 2.4.0.1717

Текущий предварительный просмотр без распознавания лиц: -

private void Video_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
{
    try
    {
        System.Drawing.Image imgforms = (Bitmap)eventArgs.Frame.Clone();
        BitmapImage bi = new BitmapImage();
        bi.BeginInit();
        MemoryStream ms = new MemoryStream();
        imgforms.Save(ms, ImageFormat.Bmp);
        ms.Seek(0, SeekOrigin.Begin);
        bi.StreamSource = ms;
        bi.EndInit();
        bi.Freeze();

        Dispatcher.BeginInvoke(new ThreadStart(delegate
        {
            frameCam.Source = bi;
        }));
    }
    catch (Exception exc)
    {
        WriteLog.Log("Error on _videoSource_NewFrame: " + exc.Message, isError: true);
        StopCamera();
    }
}

I Я попробую кое-что из того, что я нашел, но я не могу заставить его работать.

ИСПОЛЬЗОВАНИЕ EMGUCV ИЗ NUGET

static readonly CascadeClassifier cascadeClassifier = new CascadeClassifier("haarcascade_frontalface_default.xml");
    private void Video_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
    {
        try
        {
            System.Drawing.Image imgforms = (Bitmap)eventArgs.Frame.Clone();
            BitmapImage bi = new BitmapImage();
            bi.BeginInit();
            MemoryStream ms = new MemoryStream();
            imgforms.Save(ms, ImageFormat.Bmp);
            ms.Seek(0, SeekOrigin.Begin);
            bi.StreamSource = ms;
            bi.EndInit();
            bi.Freeze();

        // Nothing happen
        Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
        Emgu.CV.Image<Bgr, byte> grayImage = new Emgu.CV.Image<Bgr, byte>(bitmap);
        Rectangle[] rectangles = cascadeClassifier.DetectMultiScale(grayImage, 1.2, 1);
        foreach (Rectangle rectangle in rectangles)
        {
            using (Graphics graphics = Graphics.FromImage(bitmap))
            {
                using (System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Red, 1))
                {
                    graphics.DrawRectangle(pen, rectangle);
                }
            }
        }

        Dispatcher.BeginInvoke(new ThreadStart(delegate
        {
            frameCam.Source = bi;
        }));
    }
    catch (Exception exc)
    {
        WriteLog.Log("Error on _videoSource_NewFrame: " + exc.Message, isError: true);
        StopCamera();
    }
}

Я пытаюсь следовать некоторому примеру из пути установки emgu и помещаю в события AForge NewFrame, но зависание программы: -

Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
Image<Bgr, Byte> image = new Image<Bgr, byte>(bitmap); //Read the files as an 8-bit Bgr image  
long detectionTime;
DetectFace.DetectAndDraw(image, out detectionTime);
ImageViewer.Show(image, String.Format("Completed face and eye detection using {0} in {1} milliseconds", GpuInvoke.HasCuda ? "GPU" : "CPU", detectionTime));

Я не уверен, есть ли другой способ использовать изображение из AForge NewFrame и использовать EmguCV для обнаружения лица и создания границы обнаружения лица.

...