【发布时间】:2013-07-14 14:20:02
【问题描述】:
背景
我正在开发一个应用程序,在某些时候它有一个巨大的位图,它需要在上面使用人脸检测,所以我使用FaceDetector API
问题
人脸检测API对其输入位图有限制:
我做了什么
因为我以后需要原始位图,所以我将它存储到一个文件中。
在那之后,我回收了原始位图,并从文件中加载了一个临时的,具有正确的配置,但遗憾的是,它并不总是有效,因为我需要使用均匀的宽度,而原始位图没有t 总是有一个均匀的宽度。
我尝试告诉人脸检测 API 使用“width-1”作为宽度,但没有成功。它说“java.lang.IllegalArgumentException:位图大小与初始化不匹配”。我什至不明白为什么它需要这么奇怪的宽度限制,如果它已经有了位图,为什么它需要宽度和高度的参数......
问题
我该怎么办?
是否有可能让它与奇数宽度的位图一起工作,并且可能忽略一整列像素?
我问这个的原因是因为位图非常大,如果我将它克隆到具有相似大小(宽度均匀)的新位图,我可以很容易地在某些设备上获得 OOM。
我知道我可以使用 JNI 进行扩展(类似于我前段时间写的一篇文章,here),但我希望我能找到更好、更少硬核的方式来实现同样的目标。
如果没有其他办法,也许android有一个可以提供帮助的JNI函数?
【问题讨论】:
-
将尺寸减半不会使宽度均匀 - 事实上它会使许多偶数宽度变得奇数。均匀宽度要求可能是为了在引擎中启用一些访问优化。似乎您要么想在源头实现合规性,要么在从磁盘读回位图时重新解释位图,这样您就不会同时在内存中拥有旧版本和新版本,但同时也要进行下采样如果结果仍然足以让算法运行一个,这可能是一个好主意。
-
@ChrisStratton 我的意思是,只有当宽度为奇数时,我才应该将尺寸减半。如果你将宽度 13 减半,你应该得到 6 ,但即便如此,在某些情况下你会得到一个奇数(比如从 11 到 5)......无论如何,我知道这是一个糟糕的解决方案(并且制作一个与原始大小非常相似的位图在内存使用方面甚至更糟)所以这就是为什么我在这里问是否有一个好的选择。
-
我已经删除了我写的关于将宽度减半的部分,因为它没有意义。
-
您可能想尝试新的 Android 人脸检测 API,它没有这些限制:developers.google.com/vision
-
@pm0733464 它将如何在未安装播放服务的设备上运行?
标签: android bitmap out-of-memory face-detection