如何克服人脸检测API的限制?

时间:2013-07-14 14:20:02

标签: android bitmap out-of-memory face-detection

背景

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

问题

面部检测API对其输入位图有限制:

  1. 位图配置必须为Config.RGB_565(已编写here
  2. 位图宽度必须为偶数(写为here
  3. 我做了什么

    因为我需要稍后使用原始位图,所以我已将其存储到文件中。

    之后,我回收原始位图,并从文件加载一个临时的,具有正确的配置,但遗憾的是,它不会一直工作,因为我需要使用均匀的宽度和原始的位图并不总是有宽度。

    我已经尝试告诉人脸检测API使用" width-1"作为宽度,但它没有工作。它说" java.lang.IllegalArgumentException:位图大小与初始化"不匹配。我甚至不理解为什么它需要如此奇怪的宽度限制以及为什么它需要宽度和高度的参数,如果它已经有位图......

    问题

    我该怎么办?

    是否可以使其与奇数位图一起使用,并且可能忽略整列像素?

    我问这个的原因是因为位图非常大,如果我将它克隆到一个具有相似大小(宽度均匀)的新位图,我可以轻松地在某些设备上获得OOM。

    我知道我可以使用JNI进行扩展(类似于前一段时间写的帖子,here),但我希望我能找到一种更好,更少硬核的方式来实现同样的目标

    如果没有其他办法,也许android有一个可以帮助的JNI功能?

1 个答案:

答案 0 :(得分:0)

这可以用于转换所需格式的位图(位图必须是565格式)。

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

要改变宽度,你可以试试像

这样的东西

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