Как предотвратить утечки памяти при использовании OpenCV? - PullRequest
0 голосов
/ 11 апреля 2019

Я разработал приложение Android, использующее Opencv для обработки тяжелых изображений.

Позже в разработке я буду использовать какие-то датчики, чтобы обнаружить присутствие объекта, а затем начать обработку. Поэтому я имитировал этот датчик с помощью переменной boolean и по умолчанию установил для него значение false, а после нажатия кнопки я изменил его на true, чтобы начать обнаружение.

По умолчанию камера показывает обычный объект, и когда я нажимаю кнопку, предварительный просмотр изменяется с обработанным изображением.

Основная проблема заключается в том, что при отсутствии обработки изображения (в случае ложного значения) использование памяти достигает 1,2 ГБ, и приложение вылетает.

А в случае обработки изображений (истинный случай) использование памяти колеблется между 0,3 ГГ и 0,7 ГГ.

В обоих случаях я вызываю сборщик мусора Java, используя System.gc()

Странно то, что я думал, что при интенсивной обработке изображений будут некоторые утечки памяти, но все наоборот.

Вот мой код в onCameraFrame

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

    // FPS
    frameCounter++;
    final int fps = (int) (frameCounter * 1e9 / (System.nanoTime() - lastNanoTime));
    Runnable fpsUpdater = new Runnable() {
        public void run() {
            Log.d("fpsssssss", "" + fps);
        }
    };
    new Handler(Looper.getMainLooper()).post(fpsUpdater);
    frameCounter = 0;
    lastNanoTime = System.nanoTime();

    imgSource = inputFrame.rgba().t();
    Core.transpose(imgSource, imgSource);

    //imgSource.convertTo(enhancedMat, imgSource.type(), 1.3);


    if (canProcess) {
        counter_frame++;
        if (counter_frame == 3) {
            output = detectLargestContour(imgSource);
            counter_frame = 0;
        }
    } else {
        output = imgSource;
    }

    System.gc();

    return output;
}

Может кто-нибудь объяснить мне, что происходит?

...