【问题标题】:How to overcome the face detection API restrictions?如何克服人脸检测 API 限制?
【发布时间】:2013-07-14 14:20:02
【问题描述】:

背景

我正在开发一个应用程序,在某些时候它有一个巨大的位图,它需要在上面使用人脸检测,所以我使用FaceDetector API

问题

人脸检测API对其输入位图有限制:

  1. 位图配置必须是 Config.RGB_565(写成here
  2. 位图宽度必须是偶数(写成here

我做了什么

因为我以后需要原始位图,所以我将它存储到一个文件中。

在那之后,我回收了原始位图,并从文件中加载了一个临时的,具有正确的配置,但遗憾的是,它并不总是有效,因为我需要使用均匀的宽度,而原始位图没有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


【解决方案1】:

这可用于将位图转换为所需格式(位图必须为565格式)。

位图 mFaceBitmap = bitmapImage.copy(Bitmap.Config.RGB_565, true); bitmapImage.recycle(); // 如果你想尽快释放内存

要更改宽度,您可以尝试类似

mFaceBitmapWidth = mFaceBitmap.getWidth(); mFaceBitmap.setWidth(mFaceBitmapWidth - 1);

【讨论】:

  • 肯定会创建一个新的位图,因此使用双倍内存可以触发OOM。
  • @androiddeveloper 你可以调用 bimapImage.recycle();这将尽快释放内存。
  • 我知道,但这仍然意味着在你调用它之前,你有 2 个巨大的位图,这可能会导致 OOM。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
  • 2020-10-24
  • 2018-06-19
  • 2018-12-31
  • 2019-11-18
  • 1970-01-01
  • 2019-02-16
相关资源
最近更新 更多