Изображения в 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 раз мое использование памяти почти не изменилось.

Другие вопросы по тегам