Изображения в EmguCV не освобождают ресурсы
Я использую EmguCV 3.1.0.2282 и обнаружил, что когда я использую образ, бывают случаи, когда он не освобождает свои ресурсы и не загружает память до тех пор, пока на ПК не будет исчерпано ресурсов и не возникнет исключительная ситуация нехватки памяти.
Вот тестовый код, который я сделал в своем приложении. Когда кнопка нажата, создается новое локальное изображение на основе существующего растрового изображения в памяти. Это сделает ручную утилизацию, если флажок установлен.
private void button1_Click(object sender, EventArgs e)
{
Image<Bgr, Byte> TempImage = new Image<Bgr, Byte>(CurrentLeftBitmap);
TempImage.ThresholdBinary(new Bgr(2.2, 3.3, 4.4), new Bgr(100.0, 100.0, 100.0));
if (checkBox1.Checked)
{
TempImage.Dispose();
TempImage = null;
}
}
Я обнаружил, что каждый раз, когда я нажимаю на кнопку, память уменьшается и не будет освобождена без перезапуска приложения. Даже когда я выполняю ручную утилизацию, память все равно падает. Забавно, что если я прокомментировал шаг ThresholdBinary, он работает нормально. Тем не менее, он по-прежнему требует ручной утилизации. Я также пробовал использовать оператор USING, но все тот же.
Мой вопрос: кто-нибудь сталкивался с чем-то подобным? Как правильно реализовать эти объекты изображения?
1 ответ
Да, из-за этого у вас не останется памяти. Мне удалось использовать 32 ГБ системы, выполнив 5000 итераций вашего метода. Проблема в том, что ThresholdBinary возвращает другое изображение, вы не берете это изображение, поэтому память распределяется, но у вас нет возможности избавиться. + Изменить
TempImage.ThresholdBinary(new Bgr(2.2, 3.3, 4.4), new Bgr(100.0, 100.0, 100.0));
к
Image<Bgr, byte> newImage = TempImage.ThresholdBinary(new Bgr(2.2, 3.3, 4.4), new Bgr(100.0, 100.0, 100.0));
Поможет.
Поскольку они являются местными жителями, GC в конечном итоге доберется до их очистки. Но это всегда хорошая идея, чтобы избавиться от вещей. Итак, я добавил
TempImage.Dispose();
newImage.Dispose();
За эти 5000 раз мое использование памяти почти не изменилось.