当前位置: 首页 > 知识库问答 >
问题:

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

文德曜
2023-03-14

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

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

CameraX没有给出任何接近这个速度的东西,我不确定是不是我错过了设置。

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

例如,我可以将分辨率低至320x240至1920x960,并且两者都将以16fps(似乎有上限)出现。

当我添加一个预览用例并设置enableTorch(真)时,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)
}

在CameraX的图像分析中,有没有改变相机设置以获得更高的帧率?

是否有任何改变的东西,如传感器持续时间,ISO和曝光?

共有2个答案

毕富
2023-03-14

好吧,这把我逼疯了好几个小时。

扩展伊恩的答案为最新版本的CameraX,你现在可以直接扩展图像分析。参见CameraX与Camera2的CaptureRequest相当

所以要得到60fps,我们可以使用这个修改过的代码(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();
曾元忠
2023-03-14

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

结果是,ImageAnalysisConfig是不可扩展的,所以当你只使用其中的一个时,你不能改变相机配置,所以我的手机会使用默认的相机设置,我认为这导致了AE打开并达到16ish 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)

所以在图像分析器中它开始达到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范围。

因此,在CameraX中似乎仍然可以使用完整的Camera2逻辑,只是有点笨拙,它被隐藏在Camera2Config扩展器中,这只适用于预览用例。

 类似资料:
  • 问题内容: 我的目标是使我们的Redis服务器在生产中达到约80%的CPU利用率。通过确保我们不会利用CPU不足,同时为增长和高峰留出一些空间,这将有益于后端服务器设计。 使用Redis自己的基准测试工具时,很容易达到100%的CPU使用率: 在此基准上,我们分配了50个客户端以将1,000,000个请求推送到我们的Redis服务器。 但是在使用其他客户端工具(例如redis-lua或webdis

  • 我有一堆从Youtube下载的视频,我想从他们中提取帧。我使用的当前命令是: 但是我还想设置-r和-t选项。我想要的fps是每个视频的fps,持续时间是他们的持续时间。我知道如果我不设置-r选项,默认值是25 fps。

  • 本文向大家介绍如何使用JS console.log()技巧提高工作效率,包括了如何使用JS console.log()技巧提高工作效率的使用技巧和注意事项,需要的朋友参考一下 我们知道 console.log(message)用法很简单,表示将参数message 打印到控制台上。 console.log('前端小智') // 前端小智 const myAge = 28 console.log(my

  • 本文向大家介绍如何利用FutureBuilder提高开发效率,包括了如何利用FutureBuilder提高开发效率的使用技巧和注意事项,需要的朋友参考一下 常见场景 展示请求按钮 用户点击按钮,显示loading 展示数据或者错误 抽象模式 展示请求按钮(初始状态) 用户点击按钮,显示loading(请求中状态) 展示数据或者错误 (结束状态(成功或失败)) 转换成程序语言 以上三种现实情况对应

  • 问题内容: 我正在编写一些可调用的代码,并且执行了数千次。显然,由于反射,这非常慢。 我想看看是否可以在Java 7中使用以提高性能。到目前为止,这里是我所拥有的: 代替,我在做: 但是,这似乎并不比使用反射的Field.set调用更好。我在这里做错什么了吗? 我读到使用可能会更快,但是当我尝试使用它时,得到了。 有谁成功地优化了对Field.set或Field.get的重复调用? 问题答案: 2