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;
}

MatOpenCV4Android ライブラリのクラスです。OpenCV には組み込みのグレースケール メソッドがあることは知っていますが、グレースケールの実装と OpenCV の実装を比較したいと思います。

このメソッドは、常にガベージ コレクターを呼び出します。未使用のオブジェクトがあるとガベージ コレクターが呼び出されることはわかっていますが、コード内に未使用のオブジェクトはないと思います。

このコードがガベージ コレクターを呼び出し続けるのはなぜですか?

4

2 に答える 2

0

あなたが投稿したコードでdstは、作成されてアクセスされることはなく、関数によって返されることもありません。関数の最後でスコープ外になると、 への参照が残らないdstため、ガベージ コレクターは自由にそれを再利用できます。

これを解決するには、グレースケール値を に書き込み、dst代わりにそれを返します。それ以外の場合は、内部の画像データをimageMatグレースケール ピクセルで上書きしますが、データ型を に変更しませんCV_8UC1。これにより、 内のデータが破損しますimageMat

この問題を解決するには、 の代わりに呼び出し、dst.put()代わりにimageMat.put()戻りdstます。この線:

imageMat.put(y, x, grayscalePixel);

その後、次のようになります。

dst.put(y, x, grayscalePixel);

また、OpenCV とは異なるグレースケールの式を使用していることにも注意してください。OpenCVは次の式を使用しますが、RGB値を平均してグレー値を計算しています(ドキュメントから):

グレースケール方程式

于 2013-07-07T20:26:29.633 に答える