C# - Emgu CV - Face Recognition code stops execution at EigenObjectRecognizer and exit without error

若如初见. 提交于 2019-12-12 01:10:09

问题


I was working on Face Recognition and when i run the code it stops execution at the point where EigenObjectRecognizer is initialized and exits the program with out any error.Have any one else faced the same problem ever before?If you need additional codes i can post more. I have seen my code working until the point where the recognizer trained with data in the training set

     EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
                       trainingImages.ToArray(),
                        NameLabless.ToArray(),
                        3000,
                       ref termCrit);
                       name = recognizer.Recognize(ExtFaces[faceNo]).ToString();

The code that i have used to load from the training set is

    public FaceRecognizer()
    {
        InitializeComponent();

        try
        {
            ContTrain = ContTrain + 1;
            //Load previous trained and labels for each image from the database Here
            string NameLabelsinfo = File.ReadAllText(Application.StartupPath +
                          "/TrainedFaces/TrainedNameLables.txt");
            string[] NameLabels = NameLabelsinfo.Split('%');
            NumNameLabels = Convert.ToInt16(NameLabels[0]);
            string IDLabelsinfo = File.ReadAllText(Application.StartupPath +
                "/TrainedFaces/TrainedNameLables.txt");
            string[] IDLables = IDLabelsinfo.Split('%');
            NumIDLabels = Convert.ToInt16(IDLables[0]);


            if (NumNameLabels == NumIDLabels)
            {
                ContTrain = NumNameLabels;
                string LoadFaces;
                // Converting the master image to a bitmap

                for (int tf = 1; tf < NumNameLabels + 1; tf++)
                {
                    LoadFaces = String.Format("face{0}.bmp", tf);
                    trainingImages.Add(new Image<Gray, byte>(String.Format("
                    {0}/TrainedFaces/{1}", Application.StartupPath,
                            LoadFaces)));
                    IDLabless.Add(IDLables[tf]);
                    NameLabless.Add(NameLabels[tf]);

                }
            }
        }
        catch (Exception e)
        {
            //MessageBox.Show(e.ToString());
            MessageBox.Show("Nothing in binary database, please add at least a
            face(Simply train the prototype with the Add
                   Face Button).", "Triained faces load", MessageBoxButtons.OK,
                            MessageBoxIcon.Exclamation);
        }
    }

And the face recognizer function is as follows

      private void RecognizeFaces()
    {
        //detect faces from the gray-scale image and store into an array of type
         //            'var',i.e 'MCvAvgComp[]'

        Image<Gray, byte> grayframe = GetGrayframe();
        //Assign user-defined Values to parameter variables:
        MinNeighbors = int.Parse(comboBoxMinNeigh.Text);  // the 3rd parameter
        WindowsSize = int.Parse(textBoxWinSiz.Text);   // the 5th parameter
        ScaleIncreaseRate = Double.Parse(comboBoxScIncRte.Text); //the 2nd parameter



        var faces = grayframe.DetectHaarCascade(haar, ScaleIncreaseRate, MinNeighbors,
                                HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                                new Size(WindowsSize, WindowsSize))[0];

        if (faces.Length > 0)
        {
            Bitmap ExtractedFace;   //empty
            ExtFaces = new Image<Gray, byte>[faces.Length];

            faceNo = 0;

            foreach (var face in faces)
            {
                // ImageFrame.Draw(face.rect, new Bgr(Color.Green), 3);
                t = t + 1;
                //set the size of the empty box(ExtractedFace) which will later
                 //        contain the detected face
                ExtractedFace = new Bitmap(face.rect.Width, face.rect.Height);

                ExtFaces[faceNo] = new Image<Gray, byte>(ExtractedFace);
                    //= newExtractedImage;
                ExtFaces[faceNo] = ExtFaces[faceNo].Resize(100, 100,
                    Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
                //TermCriteria for face recognition with numbers of trained images
                 //             like maxIteration
                MCvTermCriteria termCrit = new MCvTermCriteria(ContTrain, 0.001);
                if (trainingImages.ToArray().Length != 0)
                {
                    //Eigen face recognizer
                    EigenObjectRecognizer recognizer = new EigenObjectRecognizer(
                     trainingImages.ToArray(),
                    NameLabless.ToArray(),
                     3000,
                     ref termCrit);
                     name = recognizer.Recognize(ExtFaces[faceNo]).ToString();
                    stringOutput[faceNo] = name;
                }
                faceNo++;
            }

            pbExtractedFaces.Image = ExtFaces[0].ToBitmap(); //draw the face detected
                     in the 0th (gray) channel with blue
                                color
            t = 0;

            if (stringOutput[0] == null)
                {
                    label1.Text = "Unknown";
                    label9.Text = "";
                }
                //Draw the label for each face detected and recognized
            else
             {
                   label1.Text = "Known";
                   label9.Text = stringOutput[0];

             }
        }
        if (faceNo == 0)
            {
                MessageBox.Show("No face detected");
            }
        else
        {
            btnNextRec.Enabled = true;
            btnPreviousRec.Enabled = true;
        }
    }

When this face recognizer method is called as an event it works until the point where EigenObjectRecognizer is trained and then it stops working(Exit running) and the program stops running at all.

I will look forward for your response,Thanks Sisay


回答1:


After 5 hrs at downtown with down spirit, i did the first chance exceptions to get a call stack using try-catch block and i came to realize that the images saved to the training set and image captured detected to-be-recognized didn't have the same size. So that was the reason why my program stopped and exits with out any error notification.http://www.mediafire.com/view/?bfysqsze6n2zs9y was the error message that stops me at the eigenObjectRecognizer and i solved it by resizing the images that are fed to the training set to have the same size with the image detected to be recognized.



来源:https://stackoverflow.com/questions/16499682/c-sharp-emgu-cv-face-recognition-code-stops-execution-at-eigenobjectrecogniz

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!