【问题标题】:Android Camera2 increase brightnessAndroid Camera2 增加亮度
【发布时间】:2017-11-09 07:30:15
【问题描述】:

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

我尝试按照here的建议设置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 的曝光补偿。

但亮度仍然没有影响..

【问题讨论】:

  • 有没有找到解决问题的办法
  • @SumitMarwha 还没有,是吗? ;)
  • 直到现在。 Camera2 旧款手机不会自动提高亮度
  • 你好,你找到解决办法了吗?
  • @RonakThakkar 还没有:(

标签: android android-camera2


【解决方案1】:

这里是:

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

【讨论】:

  • 请问CameraX怎么做?
【解决方案2】:

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

请注意,此控件仅在以下情况下才有效 android.control.aeMode != 关闭。即使当 android.control.aeLock == true。

意思是当自动曝光锁开启时,曝光补偿将应用在锁定的曝光上,而不是在拍照时的瞬时曝光上。

即使在您的重复请求中,曝光也会被锁定,因此无济于事。

移除自动曝光锁,它应该可以工作。

【讨论】:

  • 好的,我会检查并告诉你
  • 我厌倦了像captureRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false); 一样将其设置为false,并尝试将其删除,但结果相同,亮度没有改善..
  • 您可以在启用 EXIF 的情况下共享两张相机图片 - 我们正在使用 camera2 没有任何问题。您还应该尝试拍摄具有统一灰色背景的图像进行比较。
  • You should also try to take images with uniform grey background to compare 怎么用?
【解决方案3】:

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

调整以步数来衡量,步长由 android.control.aeCompensationStep 定义,允许范围由 android.control.aeCompensationRange 定义。"

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

以下代码将为您提供用于 +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 指定的范围内

【讨论】:

    【解决方案4】:

    你可以试试这个

    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
    • 你可以设置它 static int minCompensationRange = 0; int maxCompensationRange = 2;
    • @Jayesh 我需要在这里传递的 int 值是多少,我的意思是亮度的范围值是多少?
    【解决方案5】:

    我搞砸了 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);
    

    它使预览变得更加明亮。

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

      • 首先,正如我在问题中提到的,我需要锁定它,因为在官方文档中说.. 请注意,此控件仅在 android.control.aeMode 时有效!=离开。这个控件即使在android.control.aeLock == true时也会生效 其次,我在updatePreview()中调用cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler);
      • "even when" 意味着无论 aeLock 是真还是假,控件都可以工作(尽管如果它是真,则正常的自动曝光不会运行,这可能不是您想要的)。请检查您选择的目标帧速率是多少。曝光补偿不会导致相机运行速度低于最低目标帧速率。
      猜你喜欢
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多