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