首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >怎样才能检测到相机何时完成了曝光初始化?

怎样才能检测到相机何时完成了曝光初始化?
EN

Stack Overflow用户
提问于 2014-12-10 10:23:52
回答 1查看 423关注 0票数 2

背景

当我开始相机预览时,特别是在室内,用takePicture拍摄的预览框和照片最初是黑暗的。在下一秒,相机的曝光会自动调整,直到曝光达到最佳效果为止。当我打开手机上的摄像头应用程序时,这种行为也会发生。

问题

一旦曝光正确,我想尽快拍张照片。最好我可以注册一个回调,以便在曝光良好时被调用。我该怎么做?

我试过的

  • 将相机的曝光补偿配置为最大值。(没有帮助,在预览开始后,相机仍然花了大约一秒钟的时间才能正确曝光。)
  • 自动对焦API,但它们没有工作,因为相机不支持自动对焦。
  • 硬编码延迟1秒等待曝光。这是次优,因为在室外白天,这么多的时间是不需要的。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-25 01:34:11

遗留相机API

不幸的是,带有遗留摄像头驱动程序的设备似乎不支持这一点。因此,最好的选择似乎是启动预览,然后等待大约一秒钟。

camera2 API

使用camera2 API,您可以通过检查CaptureResult.CONTROL_AE_STATE的值来检查自动曝光状态.

示例代码

第一次开始捕获:

代码语言:javascript
运行
复制
// Auto-exposure only seems to start after the first picture has been taken
// And on the Pixel 3 XL, it finishes fastest when you make a lot of captures
captureSession.setRepeatingRequest(request, captureCallback, null);

并使用此样板代码监视自动曝光:

代码语言:javascript
运行
复制
private CaptureResult firstResult;

private final CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() {

    @Override
    public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
        super.onCaptureCompleted(session, request, result);

        if (firstResult == null)
            firstResult = result;

        boolean aeAcquired;
        Integer aeState = lastResult.get(CaptureResult.CONTROL_AE_STATE);
        if (aeState == null) {
            // This camera doesn't support monitoring of auto-exposure, so we'll just have to wait a bit and then assume it's adjusted.
            long nanosSinceFirstResult = result.get(CaptureResult.SENSOR_TIMESTAMP) - firstResult.get(CaptureResult.SENSOR_TIMESTAMP);
            long millisSinceFirstResult = nanosSinceFirstResult / 1000 / 1000;
            aeAcquired = millisSinceFirstResult >= 750;
        } else {
            aeAcquired = aeState == CameraMetadata.CONTROL_AE_STATE_CONVERGED || aeState == CameraMetadata.CONTROL_AE_STATE_FLASH_REQUIRED;
        }

        if (aeAcquired) {
            // Auto-exposure has finished
        }   
    }

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

https://stackoverflow.com/questions/27398570

复制
相关文章

相似问题

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