Android Camera2增加亮度

时间:2017-11-09 07:30:15

标签: android android-camera2

我在我的应用程序中使用android camera2拍摄连续图像,这时我使用camera2获取图像预览亮度与原始相机相比非常暗。我看到this,但答案中没有类似的要求。

我尝试按照建议here设置相机2的亮度:

  

请注意,此控件仅在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);

但它仍然显示预览为暗图像,如下所示。

在此处查看不同之处:

原装相机: enter image description here

使用Camera2: enter image description here

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

captureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 6);

我保持6,因为正如doc的建议:

  

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

但亮度仍然没有影响..

6 个答案:

答案 0 :(得分:5)

在这里:

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;
    }
}

答案 1 :(得分:1)

CONTROL_AE_LOCK应该关闭。你误解了文档,可能文档本身有点令人困惑。

  

请注意,此控件仅在以下情况下有效   android.control.aeMode!= OFF。此控件即使在以下情况下也会生效   android.control.aeLock == true。

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

即使在重复请求中,曝光也会被锁定,因此无效。

删除AE锁定它应该可以工作。

答案 2 :(得分: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);
}

答案 3 :(得分:0)

首先,不要锁定自动曝光 - 调整曝光补偿时不需要。

其次,您是否使用新的捕获请求调用了CameraCaptureSession.setRepeatingRequest?

答案 4 :(得分:0)

设置CONTROL_AE_EXPOSURE_COMPENSATION时,docs定义的第二个参数与CameraCharacteristics.CONTROL_AE_COMPENSATION_STEP相关

  

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

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

以下代码将为您提供用于+ 2EV

的曝光补偿值
• Could not deduce (Eq a) arising from a use of ‘==’
  from the context: Num a
    bound by the type signature for:
               mapinc :: forall a. Num a => [a] -> [a]
    at D:\7a.hs:4:1-29
  Possible fix:
    add (Eq a) to the context of
      the type signature for:
        mapinc :: forall a. Num a => [a] -> [a]
• In the first argument of ‘unfold’, namely ‘(== [])’
  In the expression: unfold (== []) ((+ 1) . head) tail
  In an equation for ‘mapinc’:
      mapinc = unfold (== []) ((+ 1) . head) tail
  |
5 | mapinc = unfold (==[]) ((+1).head) tail   |                  ^^^^

我还建议你检查一下这个值是否在CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE指定的范围内

答案 5 :(得分:0)

我把CaptureRequest.SENSOR_SENSITIVITY弄乱了,它在我的Samsung 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);

它使预览变得更加明亮。