将相机图片传递给OpenCV时出现OutOfMemoryException

时间:2013-04-22 13:28:58

标签: android memory-management android-camera

我正在从相机中捕获图像,我希望通过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.

了解这一点,建议似乎是使用较小版本的图像,但是如果给定设备上剩余的可用内存量,我如何大致计算出要调整大小的尺寸?

2 个答案:

答案 0 :(得分:0)

您需要先将图片调整大小,然后再将其传递给openCV。解码指令消耗大量内存,因为它将完整图像加载到内存中。即使你没有显示它。

official tutorial将向您展示如何调整图片大小而无需先将其加载到内存中

答案 1 :(得分:0)

您可以使用getMemoryClass了解您的应用程序可以使用的内存总量,总计。您将不得不计算出您的应用程序的其他数据以及上面解码的位图占用了多少。

一些粗略估计:

S II配备800万像素摄像头。假设RGB24位图,单个解码位图将占用8 * 3 = 24 MB的内存。 OpenCV矩阵可能会占用相同的,可能更多,具体取决于其内部格式(内存中的错误表明它正在尝试分配~48 MB,这大约是预期的两倍)。

这很容易超出标准应用程序可用于内存的程度 - 最小基线仅为16 MB。如果您需要更多内存,可能需要考虑使用large heap而不是正常大小的内存。这将让你获得大约两倍的内存,虽然它仍然取决于设备。