FaceRcognizer/FaceRecognizer/MainForm.cs
2018-09-20 12:48:50 +03:00

125 lines
4.0 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.UI;
using Emgu.Util;
using Emgu.CV.Face;
namespace FaceRecognizer
{
public partial class MainForm : Form
{
LBPHFaceRecognizer reconizer;
CascadeClassifier faceCascade;
Image<Gray, byte> temp;
List<Image<Gray, byte>> imageList = new List<Image<Gray, byte>>();
List<string> imageLabels = new List<string>();
List<int> imageIndicies = new List<int>();
Rectangle[] detectedFaces;
string trainImagesFolder = Application.StartupPath + "\\Train";
public MainForm()
{
InitializeComponent();
console.AppendText("Main OK!");
}
void train(string personName)
{
faceCascade = new CascadeClassifier("haarcascade_frontalface_alt_tree.xml");
reconizer = new LBPHFaceRecognizer();
foreach (var file in Directory.GetFiles(trainImagesFolder))
{
if (file.EndsWith("jpg"))
{
console.AppendText("found: " + Path.GetFileNameWithoutExtension(file));
temp = new Image<Gray, byte>(file);
console.AppendText("loaded: " + Path.GetFileNameWithoutExtension(file));
temp._EqualizeHist();
var detected_faces = faceCascade.DetectMultiScale(temp
, 1.1
, 3
, new Size(24, 24)
, Size.Empty);
if (detected_faces.Length == 0) { console.AppendText("lenght zero"); continue; }
temp.ROI = detected_faces[0];
temp = temp.Copy();
temp = temp.Resize(100, 100, Inter.Cubic);
imageList.Add(temp);
imageLabels.Add(Path.GetFileNameWithoutExtension(file));
}
}
for (int i = 0; i < imageList.Count; i++)
{
imageIndicies.Add(i);
}
try
{
reconizer.Train(imageList.ToArray(), imageIndicies.ToArray());
reconizer.Write(personName);
console.AppendText("Training done!\nFile Name: " + personName);
}
catch (Exception e) { console.AppendText("Error: " + e.Message); }
}
void recognize(string personName)
{
console.AppendText("Recognizing " + personName + "from local photos");
try
{
reconizer = new LBPHFaceRecognizer(1, 8, 8, 9, 65);
reconizer = new LBPHFaceRecognizer();
reconizer.Read(personName);
foreach (var file in Directory.GetFiles(trainImagesFolder))
{
if (file.EndsWith("jpg"))
{
Image<Gray, byte> temp2 = new Image<Gray, byte>(file);
pictureBox1.Image = temp2.Resize(pictureBox1.Width, pictureBox1.Height, Inter.Cubic).ToBitmap();
var result = reconizer.Predict(temp2);
console.AppendText(">>result:" + result.Label.ToString());
}
}
}
catch (Exception e)
{
console.AppendText("Error: " + e.Message);
}
}
private void TrainBtn_Click(object sender, EventArgs e)
{
train(nameTxtBx.Text);
}
private void RecconizeBtn_Click(object sender, EventArgs e)
{
recognize(nameTxtBx.Text);
}
private void console_TextChanged(object sender, EventArgs e)
{
console.AppendText("\n");
}
}
}