Android CameraX FPS > 30 会导致图像裁剪

问题描述 投票:0回答:1

我有一个使用 CameraX API 和

Preview
Analyzer
用例的应用程序。

我使用

Camera2Interop.Extender()
设置所需的 FPS,并将
CONTROL_AE_TARGET_FPS_RANGE
选项设置为
Range(60,60)
例如

val previewBuilder = Preview.Builder()
    .setTargetResolution(currentRes)
...
val cameraSelector = CameraSelector.Builder()
    .requireLensFacing(cameraLens)
    .build()
val fps = ConfigurationService.fps.toInt() // 60
val frameDuration = 1000000000L/fps // 1666666
if (cameraSelector.lensFacing!! == CameraSelector.LENS_FACING_FRONT) {
    Camera2Interop.Extender(previewBuilder)
        .setCaptureRequestOption(
            CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
            Range(fps, fps))
        .setCaptureRequestOption(
            CaptureRequest.SENSOR_FRAME_DURATION,
            frameDuration
        )
}

然后设置预览和分析器

val preview = previewBuilder.build()

val analysis = ImageAnalysis.Builder()
    .setTargetResolution(currentRes)
    .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
    .setOutputImageFormat(ConfigurationService.cameraInputType)
    .setImageQueueDepth(countOfCores)
    .build()

analysis.setAnalyzer(Executors.newWorkStealingPool(Runtime.getRuntime().availableProcessors()), analyzer)

val useCaseGroup = UseCaseGroup.Builder()
    .addUseCase(preview)
    .addUseCase(analysis)
    .build()
try {
    cameraProvider?.unbindAll()
    camera = cameraProvider?.bindToLifecycle(
        context as LifecycleOwner,
        cameraSelector,
        useCaseGroup
    )
    previewView.implementationMode = PreviewView.ImplementationMode.PERFORMANCE
    preview.setSurfaceProvider(
        previewView.surfaceProvider
    )
} catch (e: Exception) {
    Log.e("CameraClassificationWrapper", "Use case binding failed", e)
}

我面临的问题是,当 FPS 设置为高于 30 时,传入的图像在这种情况下仍然具有正确的宽度/高度 (1280x720),但它似乎是从传感器的一部分中裁剪出来的,导致图像显示为“放大”。对于少于 30 的图像似乎是正确的。

由于我使用分析仪使用校准相机针对特定分辨率进行实际测量,因此我需要图像与我校准的图像相匹配。

我看到多次提到其他平台或仅针对一般用例的此类问题。

我知道

Camera2
CameraConstrainedHighSpeedCaptureSession
方式,我会使用它,除非整个应用程序已经使用
CameraX
而且我真的很想避免更换整个相机后端

有没有办法使用 CameraX 以 60 FPS 获得全分辨率(高达 1080p)?

android android-camera2 android-camerax
1个回答
0
投票

该设备真的声称支持 60fps 吗?也就是说,AVAILABLE_TARGET_FPS_RANGES列出

[60,60]
吗?

如果没有,尝试设置它可能会导致意外行为,例如您所看到的情况。

如果列出了,那么不幸的是您正在测试的设备有一个错误; FOV 不应根据请求的帧速率而改变。

顺便说明一下,如果将

CaptureRequest.SENSOR_FRAME_DURATION
保留为默认值
CaptureRequest.CONTROL_AE_MODE
,则设置
ON
不会执行任何操作。仅在禁用自动曝光时才有效。所以你不妨删除它以简化你的代码。相反,如果您将
AE_MODE
设置为
OFF
,那么
CONTROL_TARGET_FPS_RANGE
将不会执行任何操作。

© www.soinside.com 2019 - 2024. All rights reserved.