2013-01-12 42 views
0

我已經提取眼睛和嘴巴在臉上,但要提取眼睛和嘴巴的情緒從臉嘴部檢測。然而,不正確地檢測口.. 這是我的代碼..眼並用哈爾級聯

private void timer1_Tick(object sender, EventArgs e) 
{ 
    using (Image<Bgr, byte> nextFrame = cap.QueryFrame()) 
    { 
     if (nextFrame != null) 
     { 
      // there's only one channel (greyscale), hence the zero index 
      //var faces = nextFrame.DetectHaarCascade(haar)[0]; 
      Image<Gray, byte> grayframe = nextFrame.Convert<Gray, byte>(); 
      Image<Gray, Byte> gray = nextFrame.Convert<Gray, Byte>(); 
      Image<Gray, Byte> gray1 = nextFrame.Convert<Gray, Byte>(); 

      var faces = grayframe.DetectHaarCascade(
          haar, 1.4, 4, 
          HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, 
          new Size(nextFrame.Width/8, nextFrame.Height/8) 
          )[0]; 

      MCvAvgComp[][] eyes = gray.DetectHaarCascade(eye, 1.1, 1, Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(20, 20)); 
      gray.ROI = Rectangle.Empty; 

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

      foreach (MCvAvgComp mouthsnap in mouthsDetected[0]) 
      { 
       Rectangle mouthRect = mouthsnap.rect; 
       // mouthRect.Offset(f.rect.X, f.rect.Y); 
       nextFrame.Draw(mouthRect, new Bgr(Color.Red), 2); 
       detectedmouth = mouthRect; 

      } 
      foreach (MCvAvgComp eyesnap in eyes[0]) 
      { 
       Rectangle eyeRect = eyesnap.rect; 
       // mouthRect.Offset(f.rect.X, f.rect.Y); 
       nextFrame.Draw(eyeRect, new Bgr(Color.Green), 2); 
      } 
      foreach (var face in faces) 
      { 
       nextFrame.Draw(face.rect, new Bgr(Color.LightGreen), 3); 
       facesnap = face.rect; 
      } 

      pictureBox1.Image = nextFrame.ToBitmap(); 
     } 
    } 

} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    cap = new Capture(0); 
    // adjust path to find your xml 
    //haar = new HaarCascade("haarcascade_frontalface_alt2.xml"); 
    haar = new HaarCascade("haarcascade_frontalface_alt_tree.xml"); 
    mouth = new HaarCascade("Mouth.xml"); 

    eye = new HaarCascade("haarcascade_eye_tree_eyeglasses.xml"); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    Image snap = pictureBox1.Image; 

    snap.Save("c:\\snapshot.jpg", System.Drawing.Imaging.ImageFormat.Jpeg); 

    pictureBox2.Image = snap; 
    pictureBox3.Image = cropImage(snap,facesnap); 
    pictureBox4.Image = cropImage(snap, detectedmouth); 

} 

private static Image cropImage(Image img, Rectangle croparea) 
{ 
    Bitmap bmpImage = new Bitmap(img); 
    Bitmap bmpCrop = bmpImage.Clone(croparea, bmpImage.PixelFormat); 
    return (Image)(bmpCrop); 
} 

請幫助我進行情感檢測和使用c#進行更好的嘴部檢測。

+0

您是否正在爲此使用一個庫,或者您是否自己編寫了這些類? – antonijn

+0

我已經直接將這段代碼寫入cs頁面並添加haarcascade文件的引用。 – vidhi

+0

哦,通過說嘴沒有正確檢測,你的意思是說,mouthsDetected變量是空陣列? –

回答

3

我會嘗試尋找一個臉部矩形口,而不是檢查孔的畫面。

var faces = grayframe.DetectHaarCascade(
          haar, 1.4, 4, 
          HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, 
          new Size(nextFrame.Width/8, nextFrame.Height/8) 
          )[0]; 
foreach (var f in faces) 
{ 
    //draw the face detected in the 0th (gray) channel with blue color 
    image.Draw(f.rect, new Bgr(Color.Blue), 2); 


    //Set the region of interest on the faces 
    gray.ROI = f.rect; 
    var 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 (var m in mouthsDetected [0]) 
    { 
      Rectangle mouthRect = m.rect; 
      mouthRect.Offset(f.rect.X, f.rect.Y); 
      image.Draw(mouthRect , new Bgr(Color.Red), 2); 
    } 
    } 
+0

謝謝你這個..但是這表明錯誤在facesDetected [0] – vidhi

+0

應該是固定的,再試一次 –

+0

okk我明白只是要使用「faces」instad的facesDetected [0] – vidhi

0

我已經在2個矩形的頂部和底部劃分了臉部區域,並將底部矩形應用到了灰色.ROI。它的工作原理..這是兩個矩形的代碼..

int halfheight = facesnap.Height/2; 
        int start = facesnap.X; 
        int start1 = facesnap.Y; 

        Rectangle top = new Rectangle(start,start1,facesnap.Width,halfheight); 
        int start2 = top.Bottom; 

        Rectangle bottom = new Rectangle(start, start2, facesnap.Width, halfheight); 
        nextFrame.Draw(bottom, new Bgr(Color.Yellow), 2); 
        //Set the region of interest on the faces 
        gray.ROI = bottom; 
        MCvAvgComp[][] mouthsDetected = gray.DetectHaarCascade(mouth, 
                1.1, 10, 
                Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, 
                new Size(20, 20));