我应Firebase工程师的要求发布此问题。
我将Camera2 API与Firebase-mlkit视觉结合使用。我同时使用条形码和平台上的OCR。我尝试解码的东西大多是设备上的标签。在测试应用程序时,我发现尝试扫描整个相机图像会产生不同的结果。主要问题是视野太宽。
不过,您不能仅仅缩小相机模式的范围-对于这种类型的扫描,用户可以从“宽”相机视图中进行对齐。理想的情况是,如果您有一个摄像机图像(为了便于讨论,假设它是1920x1080),但是只有图像的一个子集被提供给firebase-ml。您可以想象一个相机视图在屏幕上有一个向导框,然后在该框中定位和缩放要扫描的项目。
您可以选择来自Camera2 API的图像,但是如果您选择YUV_420_488以外的任何内容,firebase-ml会发出警告。问题在于,除非您自己进行操作,否则Android API中没有一种很好的方法来处理YUV图像。那就是我最终要做的-我写了一个Renderscript解决了我的问题,该脚本接受输入YUV,将其转换为RGBA,对其进行裁剪,然后在必要时进行任何旋转。这样的结果是一个位图,然后我将其输入到FirebaseVisionBarcodeDetectorOptions或FirebaseVisionTextRecognizer中。
请注意,位图本身会显示mlkit运行时警告,请我改用YUV格式。这是可能的,但是很困难。您将必须读取字节数组并从原始的camera2 yuv图像跨步获取信息并创建自己的图像。不幸的是,来自camear2的对象是受程序包保护的类,因此您不能对其进行子类化或创建自己的实例-实际上,您必须从头开始。 (我敢肯定Google有理由保护此类程序包,但是他们这样做确实很烦人。)
我上面概述的所有步骤均有效,但带有mlkit中的格式警告。使性能更好的是它-在800x300图像上运行的条形码扫描器只需要在完整尺寸的图像上花费的一小部分!
在我看来,如果Firebase着重于cropRect,那么这一切都是不必要的。根据Image API,cropRect定义图像的哪一部分有效。该属性似乎是可变的,这意味着您可以获取一个Image并在事实发生后更改其cropRect。听起来很完美。我以为我可以从ImageReader中获取一个Image,将cropRect设置为该图像的子集,然后将其传递给Firebase,并且Firebase会忽略cropRect之外的任何内容。
似乎并非如此。 Firebase似乎忽略了cropRect。在我看来,firebase应该要么支持cropRect,要么文档应该明确声明忽略它。
我对firebase-mlkit团队的要求是:
-克里斯