Я разработал приложение 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;
}
Может кто-нибудь объяснить мне, что происходит?