EmguCV Не определяет все лица на фотографиях

Есть проблема с моей программой, не всегда определяет лица по фоткам, а именно когда на одном фотографией много лиц например больше 20 или 30 он не все определяет, а частично, а иногда совсем корява, думает что рука это лицо. Использую lbpcascade_frontalface.xml и haarcascade_frontalface_default.xml для

введите сюда описание изображения

определение лиц.

Иногда на качество фоток тоже виляет, но даже с хорошей качеством тоже есть погрешность.

Что нужно добавить или изменить в коде?

using Emgu.CV;
using Emgu.CV.Structure;

namespace EmguFace
{
    public partial class Form1 : Form
    {
        Image<Bgr, byte> imgInput;

        public Form1()
        {
            InitializeComponent();
        }

        private void OpenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog dialog = new OpenFileDialog();
                if (dialog.ShowDialog() == DialogResult.OK)
                {
                    imgInput = new Image<Bgr, byte>(dialog.FileName);
                    pictureBox1.Image = imgInput.Bitmap;
                }
                else
                {
                    throw new Exception("No file selected.");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        private void DetectFaceHaarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (imgInput == null)
                {
                    throw new Exception("Please select and image");
                }

                DetectFaceHaar();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        public void DetectFaceHaar()
        {
            try
            {
                string facePath = Path.GetFullPath(@"../../data/haarcascade_frontalface_default.xml");
              //  string eyePath = Path.GetFullPath(@"../../data/haarcascade_eye.xml");
                CascadeClassifier classifierFace = new CascadeClassifier(facePath);
              //  CascadeClassifier classifierEye = new CascadeClassifier(eyePath);
                var imgGray = imgInput.Convert<Gray, byte>().Clone();

                Rectangle[] faces = classifierFace.DetectMultiScale(imgGray, 1.1, 4);
             //   Rectangle[] eyes = classifierEye.DetectMultiScale(imgGray, 1.1, 4);


                foreach (var face in faces)
                {
                    imgInput.Draw(face, new Bgr(0, 0, 255), 2);

                    imgGray.ROI = face;

                    //foreach (var eye in eyes)
                    //{
                    //    var e = eye;
                    //    e.X += face.X;
                    //    e.Y += face.Y;
                    //    imgInput.Draw(e, new Bgr(0, 255, 0), 2);
                    //}
                }
                pictureBox1.Image = imgInput.Bitmap;
                MessageBox.Show("Количество лиц =" + faces.Length.ToString());
            //    MessageBox.Show("Количество глаз =" + eyes.Length.ToString());
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public void DetectFaceLBP()
        {
            try
            {
                string facePath = Path.GetFullPath(@"../../data/lbpcascade_frontalface.xml");
                CascadeClassifier classifierFace = new CascadeClassifier(facePath);

                var imgGray = imgInput.Convert<Gray, byte>().Clone();
                Rectangle[] faces = classifierFace.DetectMultiScale(imgGray, 1.1, 4);
                foreach (var face in faces)
                {
                    imgInput.Draw(face, new Bgr(255, 0, 0), 2);
                }
                pictureBox1.Image = imgInput.Bitmap;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        private void DetectFaceLBRToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (imgInput == null)
                {
                    throw new Exception("No image selected");
                }

                DetectFaceLBP();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

}

Ответы (0 шт):