Использование памяти OpenCV в привязках Android Java

Я написал функцию итеративной обработки изображений и часть из перечисленных ниже.

            Log.d(TAG, "#1 $iterNum")

            val alphaBlendedMat = Mat(targetMat.height(), targetMat.width(), CvType.CV_8UC4)
            for (i in 0..iterNum) {
                val alpha = fromAlpha + i * (toAlpha - fromAlpha) / iterNum

//            Border thickness
                val windowMaskIter = Mat()
                windowMask.copyTo(windowMaskIter)
                erode(windowMask, windowMask, kernel)
                Core.bitwise_xor(windowMaskIter, windowMask, windowMaskIter)

//            Src+target alpha blending
                val alphaBlendedMatTmp = Mat(targetMat.height(), targetMat.width(), CvType.CV_8UC4)
                Core.addWeighted(srcMat,
                        alpha,
                        targetMat.submat(roiTarget),
                        1 - alpha,
                        0.0,
                        alphaBlendedMatTmp.submat(roiTarget))
                Core.copyTo(alphaBlendedMatTmp.submat(roiTarget), alphaBlendedMat.submat(roiTarget), windowMaskIter)

                windowMaskIter.release()
                alphaBlendedMatTmp.release()
            }

            Log.d(TAG, "#2")

Фрагмент завершается ошибкой без каких-либо исключений, когда iterNum приближается к 60. Профилировщик показывает использование памяти больше, чем разрешено на экземпляре эмулятора (~ 0,8 ГБ). Что я делаю не так, когда создаю и выпускаю новые коврики итеративным способом? Я считаю, что если я вручную освобождаю маты, сборщик мусора должен освобождать память, когда это необходимо для новых распределений. Есть ли проблема с GC или с моим пониманием вещей?


Решено:

           for (i in 0..iterNum) {
                val alpha = fromAlpha + i * (toAlpha - fromAlpha) / iterNum

//            Border thickness
                val windowMaskIter = Mat()
                windowMask.copyTo(windowMaskIter)
                erode(windowMask, windowMask, kernel)
                Core.bitwise_xor(windowMaskIter, windowMask, windowMaskIter)

//            Src+target alpha blending
                val alphaBlendedMatTmp = Mat(targetMat.height(), targetMat.width(), CvType.CV_8UC4)
                val targetRoi = targetMat.submat(roiTarget)
                val alphaBlendedMatTmpRoi = alphaBlendedMatTmp.submat(roiTarget)
                Core.addWeighted(srcMat,
                        alpha,
                        targetRoi,
                        1 - alpha,
                        0.0,
                        alphaBlendedMatTmpRoi)
                val alphaBlendedMatRoi = alphaBlendedMat.submat(roiTarget)
                Core.copyTo(alphaBlendedMatTmpRoi, alphaBlendedMatRoi, windowMaskIter)

                targetRoi.release()
                windowMaskIter.release()
                alphaBlendedMatRoi.release()
                alphaBlendedMatTmp.release()
                alphaBlendedMatTmpRoi.release()
            }

Я только что раскрыл это дело. Извините за внимание. Я публикую свой обходной путь в исходном вопросе в строке ___. Может быть, это кому-нибудь будет полезно.

RomanKovalev 07.04.2021 11:37
0
1
12
0

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