Android Camera2 如何增加亮度

22
我在我的应用程序中使用android camera2来连续拍摄图片,但是当我使用camera2时,获取图像预览的亮度与原始相机相比非常暗。我看到了这个,但是该答案中没有类似的要求。
我尝试按照此处建议的设置camera2的亮度:
注意,只有在android.control.aeMode != OFF时,此控件才有效。即使android.control.aeLock == true,此控件也会生效。
captureRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
            captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
            captureRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true);
            captureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 6);

但是它仍然只显示黑色图像,如下所示。

在这里看到区别:

原始相机: 输入图像描述

使用 Camera2: 输入图像描述

第二个参数我需要传递的值是什么:

captureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 6);

根据文档的建议,我选择了6:

例如,如果曝光值(EV)步长为0.333,则“6”表示+2 EV的曝光补偿; “-3”表示-1 EV的曝光补偿。

但是亮度仍然没有改变。


你找到问题的解决方案了吗? - Sumit Marwha
你好,你找到解决方案了吗? - Ronak Thakkar
@RonakThakkar 没有,还没有 :( - Shailendra Madda
一年后我再试试运气,@ShylendraMadda 你找到解决方案了吗?也许可以使用CameraX功能?我遇到了完全相同的问题。我在Google上开了一个github问题:https://issuetracker.google.com/issues/142652121 - Rémi P
目前还没有找到任何解决方案。 - Shailendra Madda
显示剩余2条评论
6个回答

12

这里是:

onConfigured()unlockFocus()中添加以下代码:

captureRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,getRange());

使用上述代码可以获得更好的预览,但您捕获的图片将保持原样。 要同时获得更好的图片,请在 captureStillPicture() 中使用以下相同的代码。

captureBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, getRange());

getRange是:

    private Range<Integer> getRange() {
    CameraCharacteristics chars = null;
    try {
        chars = mCameraManager.getCameraCharacteristics(mCameraId);
        Range<Integer>[] ranges = chars.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
        Range<Integer> result = null;
        for (Range<Integer> range : ranges) {
            int upper = range.getUpper();
            // 10 - min range upper for my needs
            if (upper >= 10) {
                if (result == null || upper < result.getUpper().intValue()) {
                    result = range;
                }
            }
        }
        if (result == null) {
            result = ranges[0];
        }
        return result;
    } catch (CameraAccessException e) {
        e.printStackTrace();
        return null;
    }
}

2
请问如何使用CameraX实现此功能? - Rémi P

1

在设置CONTROL_AE_EXPOSURE_COMPENSATION时,根据文档定义的第二个参数是相对于CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP的。

调整值以步数计算,步长由android.control.aeCompensationStep定义,允许范围由android.control.aeCompensationRange定义。

在+2EV的示例中,当步长为0.333时,6的值是正确的,这只是一个示例。

以下代码将给出应用于+2EV的曝光补偿值。

CameraManager manager = (CameraManager)this.getSystemService(Context.CAMERA_SERVICE);
CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
double exposureCompensationSteps = characteristics.get(CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP).doubleValue();
int exposureCompensation = (int)( 2.0 / exposureCompensationSteps );

我建议您检查该值是否在CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE指定的范围内。


1
你可以尝试这个。
public void setBrightness(int value) {
    int brightness = (int) (minCompensationRange + (maxCompensationRange - minCompensationRange) * (value / 100f));
    previewRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, brightness);
    applySettings();
 }

private void applySettings() {
    captureSession.setRepeatingRequest(previewRequestBuilder.build(), null, null);
}

我可以在哪里获取minCompensationRangemaxCompensationRange - Shailendra Madda
你可以设置静态整型变量minCompensationRange为0,maxCompensationRange为2。 - Jayesh
@Jayesh 这里我需要传递什么int值,也就是亮度的范围是多少? - Shailendra Madda

1

CONTROL_AE_LOCK 应该关闭。您可能误解了文档,可能文档本身有点混淆。

请注意,只有当 android.control.aeMode != OFF 时,此控件才有效。即使 android.control.aeLock == true,此控件也会生效。

这意味着当 AE 锁定为 ON 时,曝光补偿将应用于已锁定的曝光,而不是在拍摄时刻的瞬时曝光。

即使在您的重复请求中,曝光也被锁定,因此无法帮助。

取消 AE 锁定,它就可以工作了。


好的,我会检查并告诉你。 - Shailendra Madda
我尝试将其设置为false,例如captureRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);,并尝试将其删除,但是亮度没有改善,结果相同。 - Shailendra Madda
您可以共享启用EXIF的相机图片 - 我们使用camera2没有任何问题。您还应该尝试拍摄具有均匀灰色背景的图像以进行比较。 - mesibo
你也应该尝试使用均匀灰色背景拍摄图像以进行比较。你如何使用它? - Shailendra Madda

1

我尝试使用CaptureRequest.SENSOR_SENSITIVITY,它在我的三星S3、S7和S8手机上都表现出色。

您可以获取CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE。

sensitivity_range = chars.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE);

在我的S7上,范围从中50到超过3000。然后我按如下设置为1500。
mCaptureRequest.set(CaptureRequest.SENSOR_SENSITIVITY, 1500);

它使预览更加亮丽了几个因素。


0
首先,不要锁定自动曝光 - 调整曝光补偿时不需要这样做。
其次,您是否使用新的捕获请求调用了CameraCaptureSession.setRepeatingRequest?

首先,正如我在问题中提到的注释一样,我需要锁定它,因为官方文档中说...请注意,只有当android.control.aeMode != OFF时,此控件才有效。即使android.control.aeLock == true,此控件也会生效。其次,在“updatePreview()”中,我正在调用cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler); - Shailendra Madda
"even when" 意味着控制器可以在 aeLock 为 true 或 false 时工作(尽管如果为 true,则正常的自动曝光不会运行,这可能不是您想要的)。 请检查您选择的目标帧率。曝光补偿不能使相机运行速度低于最小目标帧率。 - Eddy Talvala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接