Я не могу найти твердый ответ / учебник / пример по использованию 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 для обнаружения лица и создания границы обнаружения лица.