裁剪YUV_420_888图片以进行Firebase条码解码

时间:2019-01-09 14:06:53

标签: firebase android-camera2

我正在使用Camera2 API以流(实时)方式使用Firebase-ML条形码解码器。我这样做的方法是设置一个ImageReader,它定期为我提供图像。完整的图像是我的相机的分辨率,所以很大-它是12MP相机。

条形码扫描仪大约需要0.41秒才能在Samsung S7 Edge上处理图像,因此我将ImageReaderListener设置为一次解码一次,然后丢弃所有后续帧,直到解码器完成为止。

我正在使用的图像格式是YUV_420_888,因为这是文档所建议的格式,并且因为如果尝试提供ML条形码解码器,则它会抱怨其他任何内容(调试日志的运行时消息)。

所有这些都有效,但是我认为如果可以裁剪图像,效果会更好。我想保持相机的分辨率不变(以便可以显示宽的SurfaceView来帮助用户将其相机对准条形码),但是我想给Firebase裁剪版本(基本上是中心矩形)。 “更好地工作”是指“更快”,但我也想消除干扰(特别是图像边缘的其他条形码)。

这使我试图找出裁剪YUV图像的最佳方法,但我惊讶地发现几乎没有帮助。我在网上找到的大多数示例都执行多步骤过程,其中首先将YUV图像转换为JPEG,然后将JPEG渲染为位图,然后对其进行缩放。我脑子里有几个问题

  • 这似乎会对实时性能产生重大影响。这将帮助我完成一些事情,包括减少一些功耗,改善响应时间以及允许我通过image.close()更快地将Image返回到ImageReader。
  • 这种方法不会使您回到Image上,因此您必须将Firebase提供给Bitmap,这似乎也不起作用。我不知道firebase在内部做什么,但我有点怀疑它在(也许完全)在Y平面之外工作,并且如果Image-> JPEG-> Bitmap的翻译使效果模糊了。

我一直在寻找可能有用的YUV库。野外有一种叫做libyuv-android的东西,但是它不能完全按照firebase-ml的格式工作,并且它是一堆JNI,这给了我跨平台的担忧。

我想知道是否还有其他人对此有所考虑,并提出了一个更好的解决方案,用于在Android中裁剪YUV_420_488图像。因为这是相对琐碎的操作,所以我找不到它吗?除其他事项外,还有很大的差距。我不是图像/色彩专家,我觉得自己不应该自己尝试这种操作,我特别担心的是,我发现可以在我的设备上正常工作的东西,但对其他设备不起作用。

更新:这实际上可能是有争议的。作为实验,我查看了从ImageReader返回的Image。它是ImageReader.SurfaceImage的一个实例,它是一个私有(对ImageReader而言)类。它也有很多本地搭配。因此,唯一的选择是执行compress / decompress方法,这似乎很la脚。我唯一想到的另一件事是,自己决定仅使用Y平面并从中制作一个位图,然后查看Firebase-ML是否可以。在我看来,这种方法仍然很冒险。

0 个答案:

没有答案