Я написал функцию итеративной обработки изображений и часть из перечисленных ниже.
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()
}
Я только что раскрыл это дело. Извините за внимание. Я публикую свой обходной путь в исходном вопросе в строке ___. Может быть, это кому-нибудь будет полезно.