gpt4 book ai didi

android - 在 camera2 上使用闪光灯拍照会出现 "after"闪光灯(即没有闪光灯)

转载 作者:太空狗 更新时间:2023-10-29 14:53:03 29 4
gpt4 key购买 nike

我的代码基于来自 Google Camera2-Basic 的示例,并添加了闪光灯始终支持。但看起来照片是在闪光发生后立即拍摄的。我(几乎)总是得到非闪光的照片,即使闪光灯被触发。

修改后的预览请求生成器:

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);

而且我还把这个控制方式加到captureStillPicture()

captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH);

并修改了 process() 开关:

       case STATE_WAITING_PRECAPTURE: {
// CONTROL_AE_STATE can be null on some devices
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
Log.i(TAG, "aeState = " + aeState);
if (aeState == null ||
aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE ||
aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED ||
aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) {
mState = STATE_WAITING_NON_PRECAPTURE;
}
break;
}

最佳答案

我遇到了完全相同的问题,也是在 Nexus 5 上。我通过检查 CaptureResult.FLASH_STATE 解决了这个问题。如果等于 CaptureResult.FLASH_STATE_FIRED 则立即触发捕获.基本上,如果闪光灯闪光,那么无论您处于什么状态,您都需要立即进行捕捉,因为它只会闪光一次。如果此时自动对焦/曝光等未正确收敛,您将无能为力。

您可以在onCaptureCompleted 的开头进行检查像这样:

if(mFlashAvailable && mWaitingForFlash)
{
Integer flashState = result.get(CaptureResult.FLASH_STATE);
if(flashState != null && flashState==CaptureResult.FLASH_STATE_FIRED)
{
mWaitingForFlash = false;

// do the capture...
mState = STATE_PICTURE_TAKEN;
captureStillPicture();

return; // don't call process()
}
}

mFlashAvailable像这样打开相机时从 CameraCharacteristics 设置:

mFlashAvailable = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);

mWaitingForFlash只是您可以在开始预捕获时设置的标志,这样您就不会捕获超过一帧。但是,在您的特定情况下,这可能不是必需的。

正如您在问题中所描述的那样,这将处理闪光灯在状态收敛之前何时闪光(即图片在闪光灯之后)。但是,您还需要处理闪光灯晚点亮的​​情况(我从未见过这种情况实际发生,但以防万一)。您可以通过设置像 mExpectingFlash = true; 这样的标志来做到这一点设置 CONTROL_AE_MODE 时至 CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH ,如果它是真的,则不会以通常的方式捕捉(因为当您检测到闪光灯闪光状态时,您将捕捉)。您也可以在获得 aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED 时设置此标志如果您使用 CONTROL_AE_MODE_ON_AUTO_FLASH .作为一个安全网,我有一个超时,所以我不会最终等待一个永远不会出现的闪光灯,以防万一 CONTROL_AE_STATE_FLASH_REQUIRED检测到但闪光灯不闪光。

如果您拍摄多帧,您可以在检测到闪光灯闪光时读取时间戳,如下所示:

 long timestamp = result.get(CaptureResult.SENSOR_TIMESTAMP);

然后对照 onImageAvailable 中图像的时间戳对其进行交叉检查

 Image image = reader.acquireLatestImage();
if (image != null)
{
long timestamp = image.getTimestamp();
// ....
}

关于android - 在 camera2 上使用闪光灯拍照会出现 "after"闪光灯(即没有闪光灯),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33894917/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com