使用haar-cascades进行面部,眼睛和嘴巴检测

时间:2016-12-12 16:11:42

标签: c# image face

我从脸上检测到眼睛和嘴巴,但是,嘴巴检测不到 我将此代码应用于3张图片,但它没有准确地检测到嘴巴 你可以在这里看到图片see the sample pictures here 对于fig1,它检测准确,但对于图2和图3,它没有检测到准确的

private void ProcessFrame(object sender, EventArgs arg)
{
    Image InputImg = Image.FromFile(@"C:\Emgu\a.jpg");
    Image<Bgr, byte> ImageFrame = new Image<Bgr, byte>(new Bitmap(InputImg));

    if (ImageFrame != null)   // confirm that image is valid 10             
    {
        Image<Gray, byte> grayframe = ImageFrame.Convert<Gray, byte>();
        var faces = grayframe.DetectHaarCascade(haarCascade, 1.4, 4,
                     HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                      new Size(40, 40))[0];
        var nos = grayframe.DetectHaarCascade(nose);
        var eyes = grayframe.DetectHaarCascade(eye, 1.1, 1,
                  HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                   new Size(20, 20));

       foreach (var eye2 in eyes[0])
       {
           Rectangle eyeRect1 = eye2.rect;
           ImageFrame.Draw(eyeRect1, new Bgr(Color.Pink), 2);
       }

       foreach (var noses1 in nos[0])
       {
          Rectangle noserect = noses1.rect;
          ImageFrame.Draw(noserect, new Bgr(Color.Blue), 2);
       }

        foreach (var face in faces)
        {
            ImageFrame.Draw(face.rect, new Bgr(Color.Green), 3);
            grayframe.ROI = face.rect;
            var mouths = grayframe.DetectHaarCascade(mouth, 
                      1.5, 10, 
                      Emgu.CV.CvEnum.HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, 
                      new Size(20, 20));
            grayframe.ROI = Rectangle.Empty;

            foreach (var mouthsnap in mouths[0])
            {
                Rectangle mouthRect = mouthsnap.rect;
                mouthRect.Offset(face.rect.X, face.rect.Y);
                ImageFrame.Draw(mouthRect, new Bgr(Color.Red), 2);
            }
        }
    }
    CamImageBox.Image = ImageFrame;
}

1 个答案:

答案 0 :(得分:0)

这是一个数据驱动的错误,而不是代码错误:您还需要训练有胡须的脸,以避免错误分类。

您显示的训练集(右侧三张图片)没有胡须。在那些图像中,你的哈尔级联学习了黑暗的曲线是一个嘴。

然后它认为图1中的胡须(左边的图像)也是一个嘴,因为它是一条很大的黑色曲线。它正确地在那条线周围绘制了一个方框,即“嘴巴”(实际上是胡须)。

通常,增加训练数据量以改善检测。

如果是数据驱动的问题,那么请查看相关问题(Eye and Mouth detection from face using haar-cascades)中已发布的方法:

  1. 在面部框内搜索嘴
  2. 将面部框划分为顶部和底部区域,然后在底部区域内搜索。