2010-10-16 68 views
4

到目前为止,我已经设法让我的程序工作并检测脸部,现在我想要做的是提取检测到的区域并在新图片框中显示,我想添加图片到数据库,并与他们比较检测到的面孔。 所以请帮助Opencv Emgu c#脸部提取

private void ProcessFrame(object sender, EventArgs arg) 
    { 
     Image<Bgr, Byte> frame = _capture.QueryFrame();      
     Image<Gray, Byte> gray = frame.Convert<Gray, Byte>(); //Convert it to Grayscale 

     //normalizes brightness and increases contrast of the image 
     gray._EqualizeHist(); 

     //Read the HaarCascade objects 
     HaarCascade face = new HaarCascade("haarcascade_frontalface_alt_tree.xml"); 
     HaarCascade eye = new HaarCascade("haarcascade_eye.xml"); 

     //Detect the faces from the gray scale image and store the locations as rectangle 
     //The first dimensional is the channel 
     //The second dimension is the index of the rectangle in the specific channel 
     MCvAvgComp[][] facesDetected = gray.DetectHaarCascade(
      face, 
      1.1, 
      10, 
      Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_ROUGH_SEARCH, 
      new Size(20, 20)); 

     foreach (MCvAvgComp f in facesDetected[0]) 
     { 
      //draw the face detected in the 0th (gray) channel with blue color 
      frame.Draw(f.rect, new Bgr(Color.Blue), 2); 
      /* 
      //Set the region of interest on the faces 
      gray.ROI = f.rect; 
      MCvAvgComp[][] eyesDetected = gray.DetectHaarCascade(
       eye, 
       1.1, 
       10, 
       Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_ROUGH_SEARCH, 
       new Size(20, 20)); 
      gray.ROI = Rectangle.Empty; 

      foreach (MCvAvgComp e in eyesDetected[0]) 
      { 
       Rectangle eyeRect = e.rect; 
       eyeRect.Offset(f.rect.X, f.rect.Y); 
       frame.Draw(eyeRect, new Bgr(Color.Red), 2); 

      }*/ 
     } 

     pictureBox1.Image = frame.ToBitmap();Application.DoEvents(); 
    } 

    private void button1_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) 
      { //stop the capture 
       button1.Text = "Start Capture"; 
       Application.Idle -= ProcessFrame; 
      } 
      else 
      { 
       //start the capture 
       button1.Text = "Stop"; 
       Application.Idle += ProcessFrame; 
      } 

      _captureInProgress = !_captureInProgress; 
     } 
    } 

回答

5

我已经成功地做到这一点,但我把这个答案去帮助别人,如果他们在同样的麻烦

gray.ROI = f.rect; 

,然后你可以将灰色任何图片框本将只显示检测区域