问题描述
我编写了迭代图像处理函数和下面列出的部分。
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,windowMaskIter)
// Src+target alpha blending
val alphaBlendedMatTmp = Mat(targetMat.height(),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.8Gb)。当我以迭代方式创建和发布新的 Mats 时,我做错了什么?我相信,如果我手动释放垫子,那么 GC 应该在需要新分配时释放内存。是GC有问题还是我对事物的理解有问题?
解决者:
for (i in 0..iterNum) {
val alpha = fromAlpha + i * (toAlpha - fromAlpha) / iterNum
// Border thickness
val windowMaskIter = Mat()
windowMask.copyTo(windowMaskIter)
erode(windowMask,CvType.CV_8UC4)
val targetRoi = targetMat.submat(roiTarget)
val alphaBlendedMatTmpRoi = alphaBlendedMatTmp.submat(roiTarget)
Core.addWeighted(srcMat,targetRoi,alphaBlendedMatTmpRoi)
val alphaBlendedMatRoi = alphaBlendedMat.submat(roiTarget)
Core.copyTo(alphaBlendedMatTmpRoi,alphaBlendedMatRoi,windowMaskIter)
targetRoi.release()
windowMaskIter.release()
alphaBlendedMatRoi.release()
alphaBlendedMatTmp.release()
alphaBlendedMatTmpRoi.release()
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)