2015-10-21 12 views
0

У меня есть программа C#, которая сработала после переменного количества времени. Я отследил его до OpenALPR и теперь дублировал проблему в тестовой программе.Аварийный сигнал OpenALPR - Попытка прочитать или записать защищенную память

Я в основном прошу получить пластины из изображения в цикле while. Он терпит неудачу после кучи итераций. Ошибка после Итерации: 179, 221, 516, 429, 295, 150

выход программы:

... 
    Iter (219) No Plates Found in image 71197e9d829d4d429e74a71c983380dc_09032015 
134103267.jpg 
Config file location provided via API 
LBP Time: 0.005ms. 
Total Time to process image: 1.916ms. 
    Iter (220) No Plates Found in image 71197e9d829d4d429e74a71c983380dc_09032015 
134103267.jpg 
Config file location provided via API 
LBP Time: 0.003ms. 
Total Time to process image: 4.071ms. 
    Iter (221) No Plates Found in image 71197e9d829d4d429e74a71c983380dc_09032015 
134103267.jpg 
Config file location provided via API 

Failure сообщение:

Unhandled Exception: 
Unhandled Exception: System.AccessViolationException: Attempted to read or write 
protected memory. This is often an indication that other memory is corrupt. 
    at openalprnet.AlprNet.Dispose(Boolean) 
System.AccessViolationException: Attempted to read or write protected memory. Th 
is is often an indication that other memory is corrupt. 
    at alpr.Alpr.{ctor}(Alpr* , basic_string<char\,std::char_traits<char>\,std::a 
llocator<char> >* , basic_string<char\,std::char_traits<char>\,std::allocator<ch 
ar> >* , basic_string<char\,std::char_traits<char>\,std::allocator<char> >*) 
    at openalprnet.AlprNet..ctor(String country, String configFile, String runtim 
eDir) 
    at AlprTest.Program.Main(String[] args) in C:\Users\foo\Desktop\c#LPR\A 
lprTest\Program.cs:line 25 

Один раз, я также получил часть другого сообщения об ошибке (не уверены, связаны ли они или нет): Unable to load regex: @###@@. Хотя вышеприведенная ошибка указывает на CTOR, у меня в моем обычном приложении произошел сбой во время вызова распознавания. Я также видел (не уверен, насколько точна эти стек следы) он в openalprnet.AlprNet.Dispose(Boolean), который был вызван из alpr.Alpr.{ctor}(...

Моей тестовой программы:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using openalprnet; 

namespace AlprTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string chipPath = "71197e9d829d4d429e74a71c983380dc_09032015134103267.jpg"; 
      string confPath = Path.GetFullPath(".\\openalpr.conf"); 
      string runtimeDirPath = Path.GetFullPath(".\\runtime_data"); 
      int i = 0; 
      while (true) 
      { 
       ++i; 
       try 
       { 
        // Look at target velocity and pick a conf file to use. 
        // 
        AlprNet alpr = new AlprNet("us", confPath, runtimeDirPath); 

        if (!alpr.isLoaded()) 
        { 
         return; 
        } 
        // Optionally apply pattern matching for a particular region 
        alpr.DefaultRegion = "va"; // was md 
        alpr.DetectRegion = true; 

        AlprResultsNet results = alpr.recognize(chipPath); 

        if (results.plates.Count < 1) 
        { 
         Console.WriteLine(" Iter ({1}) No Plates Found in image {0}", chipPath, i); 
        } 
        else 
        { 
         int j = 0; 
         foreach (var result in results.plates) 
         { 
          Console.WriteLine("Plate {0}: {1} result(s)", ++j, result.topNPlates.Count); 
          Console.WriteLine(" Processing Time: {0} msec(s)", result.processing_time_ms); 
          foreach (var plate in result.topNPlates) 
          { 
           Console.WriteLine(" - {0}\t Confidence: {1}\tMatches Template: {2}", plate.characters, 
                plate.overall_confidence, plate.matches_template); 
          } 
         } 
        } 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine("Exception caught in LPR processing. Ex={0}", ex); 
        return; 
       } 
      } 
     } 
    } 
} 

Программа зависит от распределения openalpr и соответствующего OpenCV библиотеки DLL. openalpr-net.dll, liblept170.dll, opencv_core248.dll, opencv_features2d248.dll, opencv_ffmpeg248.dll, opencv_flann248.dll, opencv_highgui248.dll, opencv_imgproc248.dll, opencv_objdetect248.dll, opencv_video248.dll. Он также использует каталог runtime_data (который я просто скопировал из примера приложения), который, как представляется, содержит данные обучения и т. Д.

Так что, очевидно, я использую C#. Я использую Visual Studio 2010 и .NET 4.0

Я предполагаю, что я использую OpenALPR неправильно и что на самом деле нет ничего плохого в этом. Казалось бы, это довольно простая функция. Помимо исправления этого вопроса ... почему это вредит моей программе и как я могу ее поймать и восстановить? Вы заметили, что мой try-catch полностью не улавливает его, и он выдает из строя все приложение.

EDIT: При запуске тестового приложения он начинается с 2gig памяти, но он просто растет, растет и растет. Он разбился с 7,7 гигабайтами после 147 циклов.

EDIT EDIT: Добавлено в вызов Dispose после каждой итерации, и теперь программа сидит довольно устойчиво при 50-75 мегабайтах памяти.

ответ

1

Оказалось, что проблема была у Dispose.

Необходимо, чтобы Dispose объекта. Еще лучше, не удаляйте объект и не используйте его повторно. Пока конфигурация не изменяется, вы можете повторно использовать объект. К сожалению, prewarp находится в конфигурации, поэтому вы, вероятно, не сможете повторно использовать объект. Вызовите Dispose перед тем, как объект покинет область действия.

  try 
      { 
       // Look at target velocity and pick a conf file to use. 
       // 
       AlprNet alpr = new AlprNet("us", confPath, runtimeDirPath); 

       if (!alpr.isLoaded()) 
       { 
        return; 
       } 
       // Optionally apply pattern matching for a particular region 
       alpr.DefaultRegion = "va"; // was md 
       alpr.DetectRegion = true; 

       AlprResultsNet results = alpr.recognize(chipPath); 

       ... 

       alpr.Dispose(); // Dispose of the object so it can clean up 
      } 
+0

Какой объект необходимо удалить? Может показать (часть) ваш измененный код? – kdbanman

+1

Да, хорошее мышление. Объект AlprNet реализует IDisposable и нуждается в очистке. – LawfulEvil