android - 如何使用 Android CameraX ImageAnalysis 提高帧率?

标签 android android-camera android-camerax

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

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

CameraX 没有提供接近该速度的任何东西,我不确定它是否是我在设置中遗漏的东西。

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

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

当我添加一个预览用例与它一起运行并设置 enableTorch(true) 时,ImageAnalysis 用例会突然开始变得更接近 20fps,偶尔会达到 30 左右的峰值。

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

这是我当前设置的一个 fragment ...

 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、曝光度之类的东西?

最佳答案

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

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

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

因此,例如,我将其添加到我的 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 扩展程序中,而且这只适用于预览用例。

关于android - 如何使用 Android CameraX ImageAnalysis 提高帧率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57485050/

相关文章:

java - Android:更改自定义 AlertDialog 背景

android - Opencv SIFT undefined reference 问题

Android 5 camera2 接口(interface)。一些白平衡值没有效果

java.lang.IllegalAccessException : Tried to access visual service WindowManager from a non-visual Context

android - 在附加的堆栈跟踪中获取了资源但从未释放 - kotlin

android - 如何在 Firestore 中为 Android 创建本地化数据方案(按语言)?

java - 无法在 Android 中使用自定义相机将捕获的图像保存在文件夹中

android - SurfaceView 或 TextureView 哪个更适合 Preview

android - 是否可以将 cameraX 或 Camera2 缩放到 Api 最大缩放限制之外

android - 将可绘制对象添加到 EditText 的左上角