首页 > 解决方案 > camera2 api google 像素不一致的图像焦点

问题描述

我正在使用 camera2 API 发送带有手动指定缩放、焦点和曝光的 captureRequest。

我每 150 毫秒发送一次相同的捕获请求,更新曝光参数以保持曝光合理。

但是,图像的质量会从一张图像到下一张图像发生巨大变化:

在此处输入图像描述

相比:

在此处输入图像描述

对我来说,焦点似乎正在从一个图像变为下一个图像,考虑到我正在设置的参数,这似乎是不可能的(见下文)。也许这是我在以快速快门速度操作时使用的手机(谷歌像素 4a)的某种神器?

这是另一个很好的例子:

在此处输入图像描述

与下一张照片相比:

在此处输入图像描述

第二张图像非常模糊,这不是由于运动模糊,因为汽车引擎盖同样模糊......除非相机在挡风玻璃上晃动?

我有时也会得到像这样非常奇怪的工件:

在此处输入图像描述

也许与卷帘快门有关?

我使用的代码如下(但由于涉及到很多类,所以被抽象了):

    private val recordRequestBuilder: CaptureRequest.Builder by lazy {
        // Capture request holds references to target surfaces
        session.device.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE).apply {
            addTarget(viewFinder.holder.surface)
            addTarget(imageReader.surface)
        }
    }

... 
recordRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF)
...
recordRequestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, DISTANCE_CONSTANT)
...
recordRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, CROP_REGION_CONSTANT)
...
recordRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF)
recordRequestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, 800)
recordRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, 1_000_000L)

... 

session.capture(
        recordRequestBuilder.build(),
        object : CameraCaptureSession.CaptureCallback() {

            override fun onCaptureCompleted(session: CameraCaptureSession, request: CaptureRequest, result: TotalCaptureResult) {
                super.onCaptureCompleted(session, request, result);

                Log.d("image_queue", "capture completed")
            }
        },
        cameraHandler
)

假设我没有在某个地方搞砸我的逻辑,你会期望我设置的参数会导致我得到的照片吗?

我不是相机专家,所以任何帮助或只是随机的沉思都会被极大地占用。

标签: android-camera2

解决方案


推荐阅读