【问题标题】:How to increase frame rate with Android CameraX ImageAnalysis?如何使用 Android CameraX ImageAnalysis 提高帧速率?
【发布时间】:2019-12-20 10:36:03
【问题描述】:

我正在研究新的 CameraX API,以了解从我们当前的 Camera2 系统切换的可行性。

在我们的 Camera2 系统中,我们使用 OpenGL 表面从 PreviewCaptureSession 捕获帧,并且我们在大多数设备上都达到了一致的 30fps 图像处理速度,其中一些能够在启用 AutoExposure 设置的情况下达到 60fps。

CameraX 没有提供接近那个速度的任何东西,我不确定我是否在设置中错过了它。

我已经为 CameraX 和 ImageAnalysis 设置了测试示例,但我获得了针对通过的图像数量的锁定帧速率。

例如,我可以将分辨率设置为低至 320x240 到 1920x960,两者都将以 16fps(看似有上限)出现。

当我添加一个 Preview 用例以与它一起运行并设置 enableTorch(true) 时,ImageAnalysis 用例将突然开始变得更像 20fps,有时会达到 30ish 的峰值。

很明显,预览用例改变了相机的某些自动曝光状态?

这是我当前设置的截图...

 private fun startCameraAnalysis() {
        val metrics = DisplayMetrics().also { viewFinder.display.getRealMetrics(it) }
        var resolution = Size(metrics.widthPixels, metrics.heightPixels)
        resolution = Size(640, 480) //set to fixed size for testing

        val aspectRatio = Rational(resolution.width, resolution.height)
        val rotation = viewFinder.display.rotation

        // Setup image analysis pipeline
        val analyzerConfig = ImageAnalysisConfig.Builder().apply {
            val analyzerThread = HandlerThread(
                "LuminosityAnalysis").apply { start() }
            setCallbackHandler(Handler(analyzerThread.looper))
     setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
            setTargetRotation(rotation)
            setTargetAspectRatio(aspectRatio)
            setTargetResolution(resolution)
        }.build()

        // Setup preview pipeline
        val previewConfig = PreviewConfig.Builder().apply {
            setTargetRotation(rotation)
            setTargetAspectRatio(aspectRatio)
            setTargetResolution(resolution)
        }.build()

        // Build Preview useCase
        val preview = Preview(previewConfig)
        preview.enableTorch(true)

        // Build Analysis useCase
        val analyzer = ImageAnalysis(analyzerConfig)
        analyzer.analyzer = LuminosityAnalyzer()

        CameraX.bindToLifecycle(this, preview, analyzer )
        preview.enableTorch(true)
}

是否可以围绕 ImageAnalysis 更改 CameraX 中的相机设置以获得更高的帧速率?

实际上是否真的可以改变传感器持续时间、ISO、曝光等内容?

【问题讨论】:

    标签: android android-camera android-camerax


    【解决方案1】:

    所以我花了更多时间进行调查,我想我现在已经想出了一个解决方案。

    事实证明,ImageAnalysisConfig 是不可扩展的,因此您无法在仅使用其中之一时更改相机配置,因此将使用我的手机上的默认相机设置,我认为这会导致 AE 开启并命中16ish FPS。

    如果您同时启动 PreviewConfig 以与它一起运行,则可以使用 Camera2Config.Extender 扩展它并直接更改 camera2 属性。这可以提高相机预览帧率,Analyzer 也将开始以相同的速率获取帧。

    例如,我将它添加到我的 PreviewConfig...

        // Create Camera2 extender
        var camera2Extender = Camera2Config.Extender(previewConfig)
            .setCaptureRequestOption(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF)
            .setCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF)
            .setCaptureRequestOption(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF)
            .setCaptureRequestOption(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_OFF)
            .setCaptureRequestOption(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH)
            .setCaptureRequestOption(CaptureRequest.SENSOR_SENSITIVITY, 100)
            .setCaptureRequestOption(CaptureRequest.SENSOR_FRAME_DURATION, 16666666)
            .setCaptureRequestOption(CaptureRequest.SENSOR_EXPOSURE_TIME, 20400000)
    

    所以这开始在 ImageAnalyser 中达到 30fps。

    如果我想打到60,我可以设置...

    .setCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF)
    .setCaptureRequestOption(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, Range(60,60))
    

    显然假设设备支持 (60,60) 目标 FPS 范围。

    所以看起来完整的 Camera2 逻辑在 CameraX 中仍然可用,只是有点笨拙,它有点隐藏在 Camera2Config 扩展器中,而且这只适用于预览用例。

    【讨论】:

      【解决方案2】:

      好吧,这让我发疯了好几个小时。

      根据 Ian 对最新版 CameraX 的回答,您现在可以直接扩展 ImageAnalysis。见CameraX equivalent of Camera2's CaptureRequest

      所以要获得 60FPS,我们可以使用这个修改后的代码(Java 和 Kotlin 中的示例):

      //Java

      ImageAnalysis.Builder builder = new ImageAnalysis.Builder();
      Camera2Interop.Extender ext = new Camera2Interop.Extender<>(builder);
      ext.setCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
      ext.setCaptureRequestOption(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range<Integer>(60, 60));
      ImageAnalysis imageAnalysis = builder.build();
      

      // 科特林

      val builder = ImageAnalysis.Builder()
      val ext: Camera2Interop.Extender<*> = Camera2Interop.Extender(builder)
      ext.setCaptureRequestOption(
                      CaptureRequest.CONTROL_AE_MODE,
                      CaptureRequest.CONTROL_AE_MODE_OFF
                  )
      ext.setCaptureRequestOption(
                      CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
                      Range<Int>(60, 60)
                  )
      val imageAnalysis = builder.build()
      

      【讨论】:

      • 在三星 Galaxy S8 自拍相机中尝试过,但没有成功,一旦我添加了这些参数,预览就会变黑,并且分析似乎不再实际获取帧,甚至如果我允许较低的范围(比如 10 到 60 而不是 60 到 60)
      【解决方案3】:

      不幸的是,Iain Stanford 的回答对我没有帮助。在将这些行中的任何一行添加到 Camera2Config.Extender 后,我的应用程序就会崩溃:

      .setCaptureRequestOption(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF)
      .setCaptureRequestOption(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF)
      .setCaptureRequestOption(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF)
      .setCaptureRequestOption(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_OFF)
      

      我收到了这个错误:

      IllegalArgumentException: Unsupported session configuration combination
      

      但是,幸运的是,我找到了一种在 Pixel 2 XL 上获得 60 FPS 的另一种方法。从here 获取一些代码。不幸的是,它只有在我将预览绘制为 TextureView 时才有效。如果我使用不使用 AutoFitPreviewBuilder 功能并且不将 Preview 绘制为 TextureView,则所有 Extender 设置都将被忽略。

      所以,我的代码:

      imageAnalysis = ImageAnalysis(createImageAnalysisConfig())
      
      val previewConfig  = createImagePreviewConfig()
      Camera2Config.Extender(previewConfig)
          .setCaptureRequestOption(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, Range(60, 60))             
          .setCaptureRequestOption(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 1)
      
      val preview = AutoFitPreviewBuilder.build(previewConfig.build(), viewFinder)
      
      CameraX.bindToLifecycle(lifecycleOwner, imageAnalysis, preview)
      preview.enableTorch(true)
      

      AutoFitPreviewBuilder 是 function from android repo examples,viewFinder 是 TextureView,imageAnalysis 是 ImageAnalysisConfig.Builder().build,createImagePreviewConfig() 返回 PreviewConfig.Builder()。顺便说一句,不要忘记在 ImageAnalysisConfig 和 PreviewConfig 中设置相机的最大分辨率:

      .setMaxResolution(Size(800, 800))
      

      希望对你有帮助。

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,我刚刚添加了 .setTargetResolution(Size(1280, 720)) 这一行在:- val imageAnalyzer = ImageAnalysis.Builder().setTargetResolution(Size(1280, 720)) .build() .also { it.setAnalyzer(cameraExecutor, LuminosityAnalyzer { luma&gt; Log.d(TAG, "Average luminosity: $luma") }) } 参考:-https://developer.android.com/training/camerax/configuration

        【讨论】:

        • 降低分辨率并不是最好的解决方案。还有其他调整比特率的方法。
        • 我知道,但答案是针对 fps 下降而不是最佳解决方案,您读过我的回答吗?我的回答中没有降低分辨率
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        • 1970-01-01
        • 2020-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多