【问题标题】:Best usage of CameraX for MLKit Text Recognition on AndroidCameraX 在 Android 上用于 MLKit 文本识别的最佳用法
【发布时间】:2020-03-01 08:23:40
【问题描述】:

我需要在 Android 上使用 MLKit 实现文本识别,我决定使用新的 CameraX api 作为相机库。我正在为图像的类或数据流的正确“管道”而苦苦挣扎,因为 CameraX 是相当新的,而且资源不多。用例是我拍摄照片,在中间裁剪一些在 UI 中可见的边界,然后将裁剪后的图像传递给将处理图像的 MLKit。

鉴于此,ImageAnalysis.Analyzer api 有什么地方吗?据我了解,此分析器仅用于预览,而不用于捕获的图像。

我的第一个想法是使用接受OnImageCapturedCallbacktakePicture 方法,但是当我尝试访问时,例如。 ImageProxy.height 应用程序因异常 java.lang.IllegalStateException: Image is already closed 而崩溃,我找不到任何解决方法。

然后我决定使用takePicture 方法的另一个重载,现在我将图像保存到文件中,然后将其读取到位图,裁剪此图像,现在我有一个可以传递给 MLKit 的图像。但是当我查看传递给FirebaseVisionTextRecognizerFirebaseVisionImage 时,它有一个factory method,我可以将我从OnImageCapturedCallback 获得的图像传递给它,这似乎是我在做一些不必要的步骤。

所以我的问题是:

  1. 是否有一些类 (CaptureProcessor?) 可以处理拍摄图像的裁剪?我想那我可以使用OnImageCapturedCallback 我会收到已经裁剪的图像。
  2. 如果我不进行实时处理而我正在进行后期处理,我是否应该使用ImageAnalysis.Analyzer

我想我可以用我目前的方法实现我想要的,但我觉得我可以使用比现在更多的 CameraX。

谢谢!

【问题讨论】:

    标签: android firebase-mlkit text-recognition android-camerax


    【解决方案1】:

    是否有一些类(CaptureProcessor?)可以处理 裁剪拍摄的图像?

    您可以在构建 ImageCapture 用例后使用setCropAspectRatio(Rational) 方法设置裁剪纵横比。此方法从旋转的输出图像的中心进行裁剪。所以基本上你在调用takePicture() 后得到的就是我认为你所要求的。

    如果我不进行实时操作,我是否应该使用 ImageAnalysis.Analyzer 处理,我在做后期处理?

    不,这在您的场景中没有意义。正如您所提到的,只有在进行实时图像处理时,您才会想使用ImageAnalysis.Analyzer

    ps:我很想看看您用于takePicture() 的代码导致IllegalStateException

    [编辑]

    看看你的代码

    imageCapture?.takePicture(executor, object : ImageCapture.OnImageCapturedCallback() {
        override fun onCaptureSuccess(image: ImageProxy) {
            // 1
            super.onCaptureSuccess(image)
    
            // 2
            Log.d("MainActivity", "Image captured: ${image.width}x${image.height}")
        }
    })
    

    在(1)处,如果你看一下super.onCaptureSuccess(imageProxy)的实现,它实际上关闭了传递给方法的imageProxy。在 (2) 中访问图像的宽度和高度会引发异常,这是正常的 - 因为图像已关闭 -。文档指出:

    应用程序负责调用 ImageProxy.close() 关闭 图片。

    所以在使用这个回调时,你可能不应该调用super...,只使用imageProxy,然后在从方法返回之前,手动关闭它(ImageProxy.close())。

    【讨论】:

    • 你好侯赛因。感谢您的回答 :) 我创建了示例存储库,其中代码因上述异常而崩溃。我应该在问题跟踪器上提交错误吗?回购:github.com/davidbilik/camerax-crash-sample
    • 嘿@Billda。刚刚编辑了我的答案。你应该提交一个错误吗?如果您仍然认为这是一个错误,为什么不呢。
    • 嗨 Husayn,很好,那应该真的解决它.. 我什至没有考虑超级调用,因为它是在我覆盖该方法时生成的。我现在不认为这是一个错误,但也许流程不是很好,因为这可能发生在我想的任何人身上。
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    相关资源
    最近更新 更多