首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Android CameraX ImageAnalysis来提高帧率?

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

Stack Overflow用户
提问于 2019-08-13 20:42:00
回答 4查看 9.9K关注 0票数 12

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

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

CameraX没有给出任何接近这个速度的东西,我也不确定这是否是我在安装过程中错过的东西。

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

例如,我可以将分辨率设置为320x240,直到1920x960,两者都会出现在一个16 For (似乎是上限)。

当我添加一个预览usecase沿着它运行,并设置enableTorch(真)时,ImageAnalysis usecase会突然开始变得更像20 set,偶尔会达到30 set的峰值。

很明显,预览会改变相机的某些AutoExposure状态?

这是我目前设置的片段..。

代码语言:javascript
运行
复制
 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周围的ImageAnalysis,以获得更高的帧率?

事实上,是否有任何改变像传感器持续时间,ISO,曝光之类的东西?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-08-14 08:32:09

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

事实证明,ImageAnalysisConfig是不可扩展的,所以您不能改变相机配置时,仅使用其中之一,所以默认的相机设置将使用在我的手机上,我认为导致AE开着,并击中16 FPS。

如果您旋转一个PreviewConfig,同时沿着它运行,那么您可以用一个Camera2Config.Extender扩展它,并直接修改camera2属性。这可以提高相机预览帧速率,分析器也将开始以相同的速度获取帧。

例如,我把这个添加到我的PreviewConfig中.

代码语言:javascript
运行
复制
    // 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中达到30 fine的水平。

如果我想达到60岁,我可以.

代码语言:javascript
运行
复制
.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扩展程序中,这只适用于预览用例。

票数 11
EN

Stack Overflow用户

发布于 2020-05-19 22:27:46

好吧,这几个小时我都快疯了。

扩展伊恩对最新版本CameraX的回答,您现在可以直接扩展ImageAnalysis。请参阅CameraX等价于CameraX 2的CaptureRequest

因此,要获得60 and,我们可以使用修改后的代码(例如Java和Kotlin):

// Java

代码语言:javascript
运行
复制
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();

// Kotlin

代码语言:javascript
运行
复制
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()
票数 8
EN

Stack Overflow用户

发布于 2019-09-18 11:15:42

不幸的是,伊安·斯坦福的回答对我没有帮助。我的应用程序在将这些行添加到Camera2Config.Extender之后就崩溃了:

代码语言:javascript
运行
复制
.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)

我发现了一个错误:

代码语言:javascript
运行
复制
IllegalArgumentException: Unsupported session configuration combination

但是,幸运的是,我找到了在Pixel 2 XL上获得60 FPS的另一种方法。从这里获取了一些代码。不幸的是,只有当我将预览绘制为TextureView时,它才能工作。如果我使用不使用AutoFitPreviewBuilder函数,并且不将预览绘制为TextureView,所有扩展程序设置都将被忽略。

所以,我的代码:

代码语言:javascript
运行
复制
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为从android回购示例获得的函数,viewFinder为TextureView,imageAnalysis为ImageAnalysisConfig.Builder().build,createImagePreviewConfig()返回PreviewConfig.Builder()。顺便说一句,不要忘记在ImageAnalysisConfig &PreviewConfig中为照相机设置最大分辨率:

代码语言:javascript
运行
复制
.setMaxResolution(Size(800, 800))

希望,它会帮助你的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57485050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档