2016-04-20 3 views
0

Я делаю проект, который снимает фотографию, когда вы улыбаетесь, но я не занимаюсь обнаружением улыбки per se.Emgu CV обнаружение улыбки

(Мой проект с фото, когда вы улыбаетесь)

Как я улыбка, так что я могу взять фотографию?

Это мой проект исходный код:

public partial class Form1 : Form 
{ 
    private Capture capture;   
    private bool captureInProgress; 
    private HaarCascade haar; 
    private HaarCascade mouth; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     haar = new HaarCascade("haarcascade_frontalface_alt_tree.xml"); 
     mouth = new HaarCascade("haarcascade_mcs_mouth.xml"); 

    } 
    private void ProcessFrame(object sender, EventArgs arg) 
    { 
     Image<Bgr, Byte> ImageFrame = capture.QueryFrame(); 

     if (ImageFrame !=null) 
     { 
      Image<Gray, byte> grayFrame = ImageFrame.Convert<Gray, byte>(); 
      Image<Gray, Byte> gray = ImageFrame.Convert<Gray, Byte>(); 
      var faces = grayFrame.DetectHaarCascade(haar, 1.4, 4, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(25, 25))[0]; 
      foreach (var face in faces) 
      { 
       ImageFrame.Draw(face.rect, new Bgr(Color.Green), 3); 

       MCvAvgComp[][] mouthsDetected = gray.DetectHaarCascade(mouth, 1.1, 10, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(20, 20)); 
       gray.ROI = Rectangle.Empty; 

       foreach (MCvAvgComp e in mouthsDetected[0]) 
       { 
        Rectangle mouthRect = e.rect; 
        mouthRect.Offset(face.rect.X, face.rect.Y); 
        ImageFrame.Draw(mouthRect, new Bgr(Color.Red), 2); 
       } 
      } 

     } 

     CamImageBox.Image = ImageFrame;  

    } 

    private void btnstart_Click(object sender, EventArgs e) 
    { 
     #region if capture is not created, create it now 
     if (capture == null) 
     { 
      try 
      { 
       capture = new Capture(); 
      } 
      catch (NullReferenceException excpt) 
      { 
       MessageBox.Show(excpt.Message); 
      } 
     } 
     #endregion 

     if (capture != null) 
     { 
      if (captureInProgress) 
      { //if camera is getting frames then stop the capture and set button Text 
       // "Start" for resuming capture 
       btnStart.Text = "Başlat"; // 
       Application.Idle -= ProcessFrame; 
      } 
      else 
      { 
       //if camera is NOT getting frames then start the capture and set button 
       // Text to "Stop" for pausing capture 
       btnStart.Text = "Durdur"; 
       Application.Idle += ProcessFrame; 
      } 

      captureInProgress = !captureInProgress; 
     } 
    } 
    private void ReleaseData() 
    { 
     if (capture != null) 
      capture.Dispose(); 
    } 
    } 
} 

ответ

1

Если вы спрашиваете о просмотре соответствующего изображения, от вашей обработки,

Emgu CV рекомендует использовать ImageBox управления для отображения цели, для следующие причины. Это можно использовать в сочетании с объектом ImageFrame (Image), который у вас есть в приведенном выше примере кода.

ImageBox - это высокопроизводительный элемент управления для отображения изображения. По возможности он отображает битмап, который разделяет память с объектом Image, поэтому копия памяти не требуется (очень быстро).

Пользователь сможет просматривать значения пикселей изображения, частоты кадров видео, типы цветов при отображении изображения.

Удобно выполнять простые операции с изображениями всего несколькими щелчками мыши.

Преобразование в растровое изображение

Класс Image имеет ToBitmap() функцию, которая возвращает Bitmap объект, который может быть легко отображается в элементе управления PictureBox с помощью формы Windows.

Обнаружение Mouth/Улыбка

Вы хотите, чтобы обеспечить XML Haarcascade для рта и захвата соответственно. См. Ниже code, который может нарисовать прямоугольник вокруг рта,

CascadeClassifier mouth = new CascadeClassifier(Application.StartupPath + "/haarcascade_mcs_mouth.xml"); 
Image<Bgr, Byte> currentframe= null; 
Image<Gray, byte> grayFrame = null; 
Capture grabber = new Capture(); 

currentframe = grabber.QueryFrame().Resize(500, 320, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC); 

      if (currentframe != null) 
      { 
       grayFrame = currentframe.Convert<Gray, Byte>(); 

       Rectangle[] mouthDetected = mouth.DetectMultiScale(grayFrame, 1.1, 10, Size.Empty, Size.Empty); 

       // to draw rectangle 
       foreach (Rectangle mouthFound in mouthDetected) 
       { 
        ... 
       } 
      }