aiden12 Ответов: 0

Сравнение живого лица с другими лицами, хранящимися в папке в C# winsform, с помощью emgu и opencv


я реализовал распознавание лиц и распознавание в форме Windows c# с помощью Emgu и OpenCV, он работает нормально, и когда нажимается кнопка сохранения, изображение сохраняется в папке, но когда я закрываю программу и повторно запускаю ее, она больше не распознает лицо, есть ли какой-нибудь способ заставить программу распознать лицо даже после завершения работы программы?

вот мой код:

using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using System.IO;

namespace aiden
{
public partial class face_recognition : Form
{
    MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_TRIPLEX, 0.6, 0.6);
    HaarCascade faceDetected;
    Image<Bgr, byte> Frame;
    Capture camera;
    Image<Gray, byte> result;
    Image<Gray, byte> trainedFace = null;
    Image<Gray, byte> grayface = null;
    List<Image<Gray, byte>> trainingImages = new List<Image<Gray, byte>>();
    List<string> labels = new List<string>();
    List<string> users = new List<string>();
    int count, numLabels, t;
    string name, names = null;

    public face_recognition()
    {

        InitializeComponent();
        //for face detection
        faceDetected = new 
       HaarCascade("haarcascade_frontalface_default.xml");
        try
        {
       string labelsinf = File.ReadAllText(Application.StartupPath + 
       "/Faces/Faces.txt");
            string[] Labels = labelsinf.Split(',');
            numLabels = Convert.ToInt16(Labels[0]);
            count = numLabels;
            string facesLoad;
            for (int i = 1; i < numLabels + 1; i++)
            {
                facesLoad = "face" + i ;
                trainingImages.Add(new Image<Gray, byte>( (Application.StartupPath + "/Faces/Faces.txt"));
                labels.Add(labels[i]);

            }

        }
        catch (Exception ex)
        {
            MessageBox.Show("not detected");
        }
    }

    private void start_Click(object sender, EventArgs e)
    {
        camera = new Capture();
        camera.QueryFrame();
        Application.Idle += new EventHandler(frameProcedure);
    }
    private void frameProcedure(object sender, EventArgs e)
    {

        users.Add("");
        Frame = camera.QueryFrame().Resize(320, 240, INTER.CV_INTER_CUBIC) ;
        grayface = Frame.Convert<Gray, Byte>();
        MCvAvgComp[][] facesDetectedNow=grayface.DetectHaarCascade(faceDetected,1.2,10,HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,new Size(20,20));
        foreach(MCvAvgComp f in facesDetectedNow[0])
        {
            result=Frame.Copy(f.rect).Convert<Gray,Byte>().Resize(100,100,INTER.CV_INTER_CUBIC);
            Frame.Draw(f.rect, new Bgr(Color.Green), 3);
            if (trainingImages.ToArray().Length != 0)
            {
                MCvTermCriteria termCriteria = new MCvTermCriteria(count, 0.001);
                EigenObjectRecognizer recognizer = new EigenObjectRecognizer(trainingImages.ToArray(), labels.ToArray(),1500,ref termCriteria);
                name = recognizer.Recognize(result);
                Frame.Draw(name, ref font, new Point(f.rect.X - 2, f.rect.Y - 2), new Bgr(Color.Red));
            }
            users.Add("");
        }
        cameraBox.Image = Frame;
        names = "";
        users.Clear();
    }

    private void saveButton_Click(object sender, EventArgs e)
    {
        count = count + 1;
        grayface = camera.QueryGrayFrame().Resize(320, 240, INTER.CV_INTER_CUBIC);
        MCvAvgComp[][] detectedFaces = grayface.DetectHaarCascade(faceDetected, 1.2, 10, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(20, 20));
        foreach (MCvAvgComp f in detectedFaces[0])
        {
            trainedFace = Frame.Copy(f.rect).Convert<Gray, byte>();
            break;

        }
        trainedFace = result.Resize(100, 100, INTER.CV_INTER_CUBIC);
        trainingImages.Add(trainedFace);
        labels.Add(textBox1.Text);
        File.WriteAllText(Application.StartupPath+"/Faces/Faces.txt",trainingImages.ToArray().Length.ToString()+",");

        for (int i = 1; i < trainingImages.ToArray().Length + 1; i++)
        {
            trainingImages.ToArray()[i - 1].Save(Application.StartupPath+"/Faces/face"+i+".bmp");
            File.AppendAllText(Application.StartupPath + "/Faces/Faces.txt", labels.ToArray()[i-1] + ",");



        }
        MessageBox.Show(textBox1.Text + "added");
    }



Я хочу использовать распознавание лиц в своей регистрационной форме для моего исследовательского проекта. любая помощь будет оценена по достоинству.
Спасибо

Что я уже пробовал:

у меня не было никакой идеи о том, как сделать программу, чтобы запомнить использование людей, чтобы я мог использовать ее в качестве опции входа в систему

Richard MacCutchan

Вам нужно предоставить дополнительную информацию. Как это происходит, когда вы повторно запускаете приложение?

aiden12

в основном, когда программа обнаруживает мое лицо, я пишу свое имя в текстовом поле и сохраняю его, когда я выхожу из кадра и возвращаюсь и снова обнаруживаю свое лицо, она показывает имя, которое я ранее ввел, но когда закрываю и повторно запускаю программу, которая, похоже, не работает, она не показывает мне имя, под которым я ввел свое лицо раньше, она не распознает мое лицо, я уже несколько дней ищу решение или даже замену о том, как создать распознаватель лиц, я хочу использовать его в своей форме входа, чтобы пользователь мог получить доступ к какой-то части программа, если программа распознает лицо

Richard MacCutchan

Где вы загружаете сохраненное изображение и как вы сравниваете его с текущим захватом?

aiden12

вот с чем я имею дело, я хочу сравнить изображения, которые я сохранил в папке, с текущим живым изображением, и если они совпадают, я хочу, чтобы он сказал мне имя, под которым я сохранил изображение, я понятия не имею, как сравнить живое изображение с уже сохраненными изображениями

Richard MacCutchan

Извините, я тоже. Но это довольно распространенная проблема в наши дни, поэтому я бы использовал Google, чтобы найти образцы и учебные пособия по этой теме.

0 Ответов