У меня есть программа 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 мегабайтах памяти.
Какой объект необходимо удалить? Может показать (часть) ваш измененный код? – kdbanman
Да, хорошее мышление. Объект AlprNet реализует IDisposable и нуждается в очистке. – LawfulEvil