【问题标题】:Eye and Mouth detection from face using haar-cascades使用 haar-cascades 从面部检测眼睛和嘴巴
【发布时间】:2013-04-06 16:08:42
【问题描述】:

我已经从脸上提取了眼睛和嘴巴,但想从眼睛和嘴巴中提取情绪。但是,嘴巴没有被正确检测到。 这是我的代码..

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# 进行情绪检测和更好的嘴巴检测。

【问题讨论】:

  • 您是在为此使用库,还是自己编写了这些类?
  • 我在cs页面直接写了这段代码,并添加了haarcascade文件的引用。
  • 哦,说没有正确检测到嘴,你的意思是mouthsDetected变量是空数组?
  • 不,它显示了嘴的矩形,但不是确切的嘴。. 2 3 个矩形出现在嘴的视频中。

标签: c# .net winforms emgucv


【解决方案1】:

我会尝试在面部矩形中寻找嘴巴,而不是检查孔图片。

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);
     }
   }

【讨论】:

  • 谢谢你。但是这在 facesDetected[0] 处显示错误
  • 应该修复了,再试一次
  • 好吧,我明白只需要使用“faces”代替 facesDetected[0]
  • 这行得通... thnx.. 但直到它显示 2 3 个矩形作为 mouth 。不同的是,现在在面部区域内..
  • 嗯,嘴通常位于脸的底部。尝试将 f.rect 分为两部分(顶部和底部)并将 gray.ROI 设置为底部。
【解决方案2】:

我已将面部区域划分为顶部和底部 2 个矩形......并将底部矩形应用于 gray.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));

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 2013-07-14
    • 2013-10-21
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2012-11-24
    相关资源
    最近更新 更多