125 lines
4.0 KiB
C#
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");
|
|
}
|
|
|
|
|
|
}
|
|
}
|