如何使用EmguCV从WPF中的AForge帧中检测人脸?

时间:2020-03-28 07:04:46

标签: wpf emgucv aforge

我找不到将EmguCV与AForge NewFrame一起使用的确切答案/教程/示例。我已经从Nuget和DLL参考中尝试了Emgu,但是面部检测的结果仍然无法成功。

版本:-

  • 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();
    }
}

我已经尝试了一些尝试,但是我无法使它起作用。

使用来自NUGET的EMGUCV

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检测面部并创建面部检测边框。

0 个答案:

没有答案
相关问题