-3

我已经从脸部检测到眼睛和嘴巴,.. 但是,嘴巴没有被正确检测到我将此代码应用于 3 张图片但它没有准确地检测到嘴巴你可以看到这里的图片 看到这里的示例图片 对于图 1,它检测到准确但对于 fig 2 和 fig3 它检测不准确

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

1 回答 1

0

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

如图所示,您的训练集(右侧三张图片)没有胡须。在这些图像中,您的 Haar 级联知道深色曲线是一张嘴。

然后它认为 fig1 中的胡须(左图)也是一张嘴,因为它是一条大的深色曲线。它已经正确地围绕该线绘制了一个框,即“嘴”(实际上是胡须)。

一般来说,增加训练数据量来提高检测。

如果这不是数据驱动的问题,请查看已在相关问题中发布的方法(使用 haar-cascades 从面部检测眼睛和嘴巴):

  1. 在人脸框内搜索嘴巴
  2. 将人脸框分为顶部和底部区域,然后在底部区域内搜索。
于 2016-12-12T20:45:42.570 回答