4

OpenCVで処理したいカメラから画像をキャプチャしています。ただし、古いデバイスでは、これは最初のハードルで失敗しています。

public void onPictureTaken(byte[] jpeg, Camera c) {
  mImageBitmap = BitmapFactory.decodeByteArray(jpeg, 0, jpeg.length);
  org.opencv.android.Utils.bitmapToMat(mImageBitmap, Utils.cameraMat);
  ...
}

プロデュース:

04-22 14:23:41.708: I/System.out(7289): Available memory (bytes): 5646168
04-22 14:23:41.718: I/dalvikvm-heap(7289): Forcing collection of SoftReferences for 51121168-byte allocation
04-22 14:23:41.758: E/dalvikvm-heap(7289): Out of memory on a 51121168-byte allocation.

これについて読んでみると、アドバイスは小さいバージョンの画像で機能するようですが、デバイスに残っている使用可能なメモリの量を考慮して、どのサイズにサイズ変更するかを大まかに決めるにはどうすればよいですか?

4

2 に答える 2

0

画像を openCV に渡す前に、画像のサイズを変更する必要があります。デコード命令は、イメージ全体をメモリにロードするため、多くのメモリを消費します。表示しなくても。

この公式チュートリアルでは、最初にメモリに読み込まずに画像のサイズを変更する方法を紹介します

于 2013-04-22T14:20:09.377 に答える
0

getMemoryClassを使用すると、アプリケーションで使用できるメモリの合計量を確認できます。アプリケーションの他のデータと上記のデコードされたビットマップでどれだけの量を消費しているかを計算する必要があります。

大まかな見積もり:

S II には 8 MP カメラが搭載されています。RGB24 ビットマップを想定すると、1 つのデコードされたビットマップは 8 * 3 = 24 MB のメモリを占有します。OpenCV マトリックスはおそらくほぼ同じ量を使用しますが、その内部形式によってはさらに多くの可能性があります (メモリ不足エラーは、ここでの予想の約 2 倍である ~48 MB を割り当てようとしていることを示唆しています)。

これは、標準のアプリがメモリに使用できる量をはるかに超えています。最小ベースラインはわずか 16 MB です。より多くのメモリが必要な場合は、通常のサイズのヒープではなく、大きなヒープの使用を検討することをお勧めします。これにより、デバイスに依存しますが、メモリを約 2 倍にすることができます。

于 2013-04-22T16:02:59.013 に答える