2013-07-07 125 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的原因。