How to load Face & turns it so it'll recognize the faces

18 Views Asked by At

I've been trying to create a face recognition system. I managed to write the code to save faces as objects and store them in a folder. However, I'm now confused about how to make it automatically recognize faces when I turn on the webcam, and turns the label to the face file name. Since my code I believe were simple than the Internet, so it makes me more confused, I'm all ears to hear every single advice and comment, thank you, shall I change the whole code?

  private async Task StreamVideo2()
{
    var faceCasade = new CascadeClassifier("./detection/haarcascade_frontalface_default.xml");
    var vc = new VideoCapture(0, Emgu.CV.VideoCapture.API.DShow);

     // Get the list of saved face images
     string folder = Path.Combine(Application.StartupPath, "TrainedFaces");
     string[] savedImages = Directory.GetFiles(folder, "*.bmp");


     while (streamVideo)
    {

        var frame = new Mat();
        var frameGray = new Mat();
        vc.Read(frame);
        CvInvoke.CvtColor(frame, frameGray, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);

        var faces = faceCasade.DetectMultiScale(frameGray, 1.3, 5);

        if (faces != null && faces.Length > 0)
        {
            CvInvoke.Rectangle(frame, faces[0], new MCvScalar(0, 255, 0), 2); // --> MCvScalar EMGU STRUCTURE [ RETACLE GREEN ON FACE ]



            // Crop
            var faceRect = faces[0];
            var croppedFace = new Mat(frame, faceRect);

            // LABEL
            string labelText = "Detected Face";
            var font = new Emgu.CV.CvEnum.FontFace();
            var fontScale = 0.8;
            var fontThickness = 1;
            var fontColor = new MCvScalar(0, 255, 0); 
            var textOrg = new System.Drawing.Point(faceRect.X, faceRect.Y - 10); 
            CvInvoke.PutText(frame, labelText, textOrg, font, fontScale, fontColor, fontThickness);

            // ResizedCroppedFace
            var resizedCroppedFace = new Mat();
            var resizedSize = new System.Drawing.Size(184, 192); // Size to keep the croppedFace.
            CvInvoke.Resize(croppedFace, resizedCroppedFace, resizedSize);

            // Convert cropped face to black and white (grayscale)
            var grayCroppedFace = new Mat();
            CvInvoke.CvtColor(resizedCroppedFace, grayCroppedFace, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);

            // Display the grayscale cropped face in pictureBox2
            pictureBox2.Image = grayCroppedFace.ToBitmap();
        }
        else
        {
            pictureBox2.Image = null;
        }

        // TURN CAMERA TO IMG PICTURE BOX
        var img = frame.ToBitmap();
        pictureBox1.Image = img;


        label1.Text = "Mat Size: " + frame.Width.ToString() + " X " + frame.Height.ToString();
        if (CvInvoke.WaitKey(1) == 27)
        {
            break;
        }


        await Task.Delay(16);
    }
} 

 
 private void button1_Click(object sender, System.EventArgs e)
 {

     if (pictureBox2.Image != null) 
     {
         
         string folder = Path.Combine(Application.StartupPath, "TrainedFaces");
         string filename = textBox1.Text.Trim();
         string savePath = Path.Combine(folder, $"{filename}.bmp");

         // Saved As An Object
         using var bitmapImage = new Bitmap(pictureBox2.Image);
         bitmapImage.Save(savePath, System.Drawing.Imaging.ImageFormat.Bmp);
         MessageBox.Show("Succed");
         textBox1.Clear();
         


         if (!Directory.Exists(folder))
         {
             MessageBox.Show("Not Found");
         }
     } else
     {
         MessageBox.Show("Turn On The Camera");
     }
 }```


I tried few things, but it just make me lost more & more.
0

There are 0 best solutions below