2016-09-06 6 views
1

Я разрабатываю приложение распознавания лиц USIN EmguCV 3.1. И я использую EigenFaceRecognizer как алгоритм распознавания. Я попытался подготовить изображение, используя приведенный ниже код.'Emgu.CV.Util.CvException' произошло в 'Emgu.CV.World.dll' - При попытке предсказать

List<Image<Gray, byte>> trainingImages = new List<Image<Gray, byte>>(); 
    FaceRecognizer recognizer; 
    List<Face> faceList = new List<Face>(); 
     ... 
     ... 
     recognizer = new EigenFaceRecognizer(80, double.PositiveInfinity); 
     ... 
     ...    
     Image<Gray, byte> image = new Image<Gray, byte>(imgBox2.DisplayedImage.Bitmap); 
     trainingImages.Add(image); 
     List<int> trainigLabels = new List<int>(); 
     recognizer.Train(trainingImages.ToArray(), trainigLabels.ToArray()); 
     recognizer.Save("TraningData"); 
     faceList.Add(new Face(image.Bytes.Length, txtName.Text)); 
     ... 
     ... 
     Image<Gray, byte> image = new Image<Gray, byte>(imgBox2.DisplayedImage.Bitmap); 
      recognizer.Load("TraningData"); 
      try 
      { 
       var result = recognizer.Predict(image); 
       MessageBox.Show(result.Label.ToString()); 
      } 
      catch (Emgu.CV.Util.CvException ex) 
      { 
       Console.WriteLine(ex); 
      } 

Но когда этот код вызывается, он дает мне следующую ошибку.

A first chance exception of type 'Emgu.CV.Util.CvException' occurred in Emgu.CV.World.dll 
The program '[1136] IPTest.vshost.exe' has exited with code -1073741819 (0xc0000005) 'Access violation'. 
The program '[1136] IPTest.vshost.exe: Program Trace' has exited with code 0 (0x0). 

Это происходит при попытке использовать recognizer.Train(). Что я сделал не так?

UPDATE
После нескольких проб и ошибок я узнал, что проблема является методом recognizer.Predict().
Когда я TRY/поймать это показывает, за исключением следующего

Emgu.CV.Util.CvException: OpenCV: The matrix is not continuous, thus its number of rows can not be changed 
+1

Если я не ошибаюсь, 'first chance exception' означает, что вы где-то поймали исключение, иначе разместите блок try/catch вокруг своего кода и поймайте его. Пожалуйста, покажите нам сообщение об исключении и трассировку стека – slawekwin

+0

@slawekwin благодарит вас. Я обновлю вопрос –

+0

, так это ошибка в 'распознаватель.Train()' или 'распознаватель.Predict()'? – slawekwin

ответ

-1

Ok Я нашел решение. Проблема не в моем коде. Он бросается, когда собственный код пытается получить доступ к некоторым местам памяти, которые повреждены или к которым у него нет доступа.
Итак, я нашел простое и эффективное решение.

try 
{ 
    var result = recognizer.Predict(image); 
} 
catch (System.AccessViolationException) 
{ 
    recognier = new EigenFaceRecognizer(80, double.PositiveInfinity); 
} 

Но вы не можете поймать AccessViolationException во время выполнения. Поэтому вам нужно изменить настройки, чтобы вы могли. Для этого вы можете следовать this question и отвечать.