【问题标题】:Camera Preview is too dark in low light android相机预览在低光android中太暗了
【发布时间】:2015-02-10 10:14:14
【问题描述】:

我的相机应用预览在低光下太暗。如果我打开我的谷歌相机,它会增加预览中的亮度,以便我们的脸可以看到拍照。但是我的预览是完全黑暗的。我已经处理了亮度和光传感器。我的光传感器在光线充足时工作。我需要使预览可见。让我来处理什么?

 public void initialBrightness() {
        try {
            brightnessMode = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE);
        } catch (Settings.SettingNotFoundException e) {
            e.printStackTrace();
        }
        if (brightnessMode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {
            Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE,
                    Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
            brightnessModeAuto = true;
        }
        Settings.System.putInt(this.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 95);
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.screenBrightness = 100;
        getWindow().setAttributes(lp);

    } 

在调用相机预览类之前,我在 onCreate 方法中调用了这个方法。

【问题讨论】:

  • 在我的问题中,我已经明确提到我正在处理亮度。我可以增加亮度。但是有一些不同的东西使预览变暗。请再看一遍这个问题。
  • @LikithTs 请发布您的代码,显示您如何设置亮度。
  • 我已尝试将亮度增加到最大值 255。但这只会增加屏幕亮度。我也用过光传感器。我的预览在弱光下会完全变暗。那时光传感器不会增加预览亮度。
  • iRuth 请帮助我。我不认为与亮度有关,因为我已经增加了亮度并检查了。我不知道为什么这些人投票反对。

标签: android android-camera preview


【解决方案1】:

要解决此问题,您必须解锁 autoExposureCompensation 并设置为 MAX 值:

Camera.Parameters params = mCamera.getParameters();
 
params.setExposureCompensation(params.getMaxExposureCompensation());
 
if(params.isAutoExposureLockSupported()) {
 params.setAutoExposureLock(false);
}

mCamera.setParameters(params);

根据Android Develop > Reference > Camera.Parameters

使用 setWhiteBalance(String) 更改白平衡模式将释放自动白平衡锁定,如果已设置。

例如,曝光补偿、AE 锁定和 AWB 锁定可用于捕捉包围曝光的图像连拍。调用相机 release() 后,自动白平衡状态,包括锁定状态,将不再保持。

在 open() 之后但在第一次调用 startPreview() 之前锁定自动白平衡将根本不允许自动白平衡例程运行,并可能导致捕获的图像颜色严重不正确。

所以要小心并在第一次调用 startPreview() 之后使用上述代码

【讨论】:

  • 如果在camera2里怎么办?
  • 如果你找到了@ShylendraMadda 我感兴趣的答案!我在 CameraX 新库上遇到了完全相同的问题
【解决方案2】:

试试下面的代码。它对我有用。

   previewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, getRange());//This line of code is used for adjusting the fps range and fixing the dark preview
   previewRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
   previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_START);

getRange() 函数如下:

private Range<Integer> getRange() {
    CameraManager mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    CameraCharacteristics chars = null;
    try {
        chars = mCameraManager.getCameraCharacteristics(cameraId);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
    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;
            }
        }
    }
    return result;
}

【讨论】:

  • 这是迄今为止唯一对我有用的解决方案。但我得到的预览看起来像夜间模式
【解决方案3】:

在使用不同设置进行数小时测试后,对我有用的是减少每秒帧数。

通过这样做,我猜自动曝光校正有足够的时间来计算可用光线的最佳设置。

所以,从 30 fps 降低到 10 fps 就成功了。

mCameraSource = new CameraSource.Builder(context, detector)
            .setRequestedPreviewSize(640, 480)
            .setFacing(CameraSource.CAMERA_FACING_FRONT)
            .setRequestedFps(10.0f)
            .build();

【讨论】:

  • 这里的 .serRequestedFps 是什么?
  • 如何设置每毫秒的帧数?
【解决方案4】:

根据我的实验,场景模式设置可以更改预览(与 ISO 或曝光补偿不同,它们都适用于拍摄的照片)。不要使用自动。试试 scene-mode-values=night 或 scene-mode=dusk-dawn。

场景的问题是支持的值没有跨设备标准化。但通常会出现某种夜晚。

【讨论】:

  • 我已经实现了 SCENE_MODE_NIGHT。我在开始预览时已经实现了。如果我错了,请用一些示例代码纠正我。
  • 我通过为相机提供可变 fps 来解决它。首先调用 Camera.getParameter.getSupportedPreviewFpsRange();就我而言,我得到了(15000 到 15000)、(24000 到 24000)、(30000 到 30000)和(15000,30000)。我尝试设置范围从 15000 到 30000。确保您传递给不同的数字。
【解决方案5】:

通过在此处阅读 Android Camera 应用的开源代码:

https://android.googlesource.com/platform/packages/apps/Camera.git/+/lollipop-release

它以这种方式初始化相机:

// Reset preview frame rate to the maximum because it may be lowered by
// video camera application.
 List<Integer> frameRates = parameters.getSupportedPreviewFrameRates();
        if (frameRates != null) {
            Integer max = Collections.max(frameRates);
            parameters.setPreviewFrameRate(max);
        }

它在 Android Nexus 5 中运行良好,棒棒糖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多