我找不到将EmguCV与AForge NewFrame一起使用的确切答案/教程/示例。我已经从Nuget和DLL参考中尝试了Emgu,但是面部检测的结果仍然无法成功。
版本:-
当前没有脸部检测的预览:-
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检测面部并创建面部检测边框。