-3

私は顔から目と口を検出しました..しかし、口は適切に検出されません.3つの画像にこのコードを適用しますが、口を正確に検出しません.ここで写真を見ることができます.ここ でサンプル写真を参照してください.しかし、図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;
}
4

1 に答える 1

0

これはデータ駆動型のエラーであり、コード エラーではありません。この誤分類を回避するには、ひげのある顔でもトレーニングする必要があります。

表示されているトレーニング セット (右側の 3 つの画像) にはひげがありません。これらの画像で、Haar カスケードは暗い曲線が口であることを学習します。

次に、図 1 (左側の画像) のあごひげも大きな暗い曲線であるため、口であると見なします。その線、つまり「口」(実際にはひげ) の周りにボックスが正しく描画されています。

一般に、トレーニング データの量を増やして検出を改善します。

これがデータ駆動型の問題でない場合は、関連する質問 ( haar-cascades を使用した顔からの目と口の検出) に既に投稿されているアプローチを見てください。

  1. フェイスボックス内で口を探す
  2. フェイス ボックスを上部と下部の領域に分割し、下部の領域内を検索します。
于 2016-12-12T20:45:42.570 に答える