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

您可以通过getMemoryClass了解您的应用程序总共可以使用多少内存。您必须计算出您使用应用程序的其他数据以及上面的解码位图消耗了多少。

一些粗略的估计:

S II 有一个 8 MP 相机。假设一个 RGB24 位图,单个解码位图将占用 8 * 3 = 24 MB 的内存。OpenCV 矩阵可能会占用大致相同的空间,可能更多取决于其内部格式(内存不足错误表明它正在尝试分配 ~48 MB,这大约是此处预期的两倍)。

这很容易超过标准应用程序可用于内存的容量 - 最小基线仅为 16 MB。如果您需要更多内存,您可能希望考虑使用大堆而不是正常大小的堆。这将使您获得大约两倍的内存,尽管它仍然依赖于设备。

于 2013-04-22T16:02:59.013 回答
0

在将图像传递给 openCV 之前,您需要调整图像大小。解码指令会消耗大量内存,因为它将完整的图像加载到内存中。即使你不显示它。

官方教程将向您展示如何调整图像大小而无需先将其加载到内存中

于 2013-04-22T14:20:09.377 回答