2013-07-07 73 views
0

我写一个自定义的灰度转换方法:图像处理呼叫垃圾收集

public Mat grayScaleManual(Mat imageMat){ 
    Mat dst = new Mat(imageMat.width(), imageMat.height(), CvType.CV_8UC1); 
    double[] bgrPixel; 
    double grayscalePixel; 

    for(int y = 0; y < imageMat.height(); y++){ 
     for(int x = 0; x < imageMat.width(); x++){ 
     bgrPixel = imageMat.get(y, x); 
     grayscalePixel = (bgrPixel[0] + bgrPixel[1] + bgrPixel[2])/3; 
     imageMat.put(y, x, grayscalePixel); 
     } 
    } 

    return imageMat; 
} 

Mat从OpenCV4Android库中的一类。我知道OpenCV有一个内置的灰度级方法,但我想对我的灰度级实现和OpenCV进行比较。

这种方法总是让垃圾回收器调用。我知道垃圾收集器在有未使用的对象时被调用,但我认为我的代码中没有任何未使用的对象。

为什么这个代码保持通话垃圾收集器?

回答

0

在您发布的代码,创建dst,从不访问的,也不是你的函数返回。当它超出在函数结束范围,任何引用,留给dst,所以垃圾收集器是免费回收它。

为了解决这个问题,你可以写灰度值dst,然后再返回来代替。否则,要覆盖图像数据中imageMat与灰度像素,但不改变数据类型CV_8UC1。这会破坏imageMat中的数据。

要解决此问题,请致电dst.put()代替imageMat.put(),并返回dst代替。行:

imageMat.put(y, x, grayscalePixel); 

就变成了:

dst.put(y, x, grayscalePixel); 

我也应该注意到,您正在使用灰度不同的配方比OpenCV的做。您正在平均RGB值来计算灰度值,而OpenCV中使用以下公式(从documentation):

Greyscale Equation

0

线

Mat dst = new Mat(imageMat.width(), imageMat.height(), CvType.CV_8UC1); 

将分配,这将在您的方法结束被丢弃新垫对象。这可能是此方法中GC的原因。