Emgucv не может обучить более 210 изображений, используя EigenFaceRecognizer, он прекращает писать новые детали или данные - PullRequest
0 голосов
/ 09 июля 2019

Всем доброго времени суток. Я относительно новичок в OpenCV с использованием .net-оболочки Emgucv. Моя программа - это простое обнаружение и распознавание лиц, сначала я обучаю лица пользователей, как минимум 20 изображений размером 100x100 пикселей на пользователя и записываю (EigenFaceRecognizer) данные в файлы yml., затем загрузите эти файлы (пользовательские изображения и данные в формате yml) перед запуском распознавания или сравнения в реальном времени, он отлично работал с 9 пользователями (9x20 = 180 изображений).Однако, когда я пытаюсь зарегистрироваться или обучить другого пользователя, я замечаю, что (EigenFaceRecognizer) перестает записывать данные в yml.Как мы решаем это?Формат моих данных с расширением yml ниже

 opencv_eigenfaces:
   threshold: .Inf
   num_components: 10
   mean: !!opencv-matrix
   rows: 1
   cols: 4096
   dt: d
   data: []    

TrainingData.yml https://www.dropbox.com/s/itm58o24lka9wa3/trainingData.yml?dl=0

1 Ответ

1 голос
/ 09 июля 2019

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

 private async Task LoadData()
    {
        outputBox.Clear();
        var i = 0;
        var itemData = Directory.EnumerateFiles("trainingset/", "*.bmp");
        var enumerable = itemData as IList<string> ?? itemData.ToList();
        var total = enumerable.Count();
        _arrayNumber = new int[total];
        var listMat = new List<Mat>();

        foreach (var file in enumerable)
        {
            var inputImg = Image.FromFile(file);
            _inputEmGuImage = new Image<Bgr, byte>(new Bitmap(inputImg));
            var imgGray = _inputEmGuImage.Convert<Gray, byte>();
            listMat.Add(imgGray.Mat);
            var number = file.Split('/')[1].ToString().Split('_')[0];
            if (number != "")
            {
                _arrayNumber[i] = int.Parse(number);
            }
            i++;
            processImg.Image = _inputEmGuImage.ToBitmap();
            outputBox.AppendText($"Person Id: {number} {Environment.NewLine}");
            if (total == i)
            {
                fisherFaceRecognizer.Train(listMat.ToArray(), _arrayNumber);
                fisherFaceRecognizer.Write(YlmPath);
               // FaceRecognition.Train(listMat.ToArray(), _arrayNumber);
               // FaceRecognition.Write(YlmPath);
                MessageBox.Show(@"Total of " + _arrayNumber.Length + @" successfully loaded");
            }
            await Task.Delay(10);
        }
    }
...