Android相机,如何设置曝光时间的上限?

时间:2017-01-25 10:55:56

标签: android android-camera2

我的Android应用程序捕获预览帧。框架必须不模糊。 这需要限制传感器的曝光时间。例如,我希望曝光时间小于10毫秒,白平衡调整器仅使用ISO。

我找到的唯一解决方案是修复SENSOR_EXPOSURE_TIMESENSOR_SENSITIVITY

public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result)
{
    // measure ISO and exposure
    mExposure = result.get(CaptureResult.SENSOR_EXPOSURE_TIME);
    mSensitivity = result.get(CaptureResult.SENSOR_SENSITIVITY);
    ...
}

void prepareCapturing()
{
    // setting the necessary values of ISO and exposure
    if (mExposure > 10.0 * 1e+6)
    {
        double exposure = 10.0 * 1e+6;
        double sens = mExposure * mSensitivity / exposure;

        mPreviewRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, (long)exposure);
        mPreviewRequestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, (int)sens);
    }

    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
    setRepeatingRequest();
}

在运行预览帧分析算法之前,我调用方法prepareCapturing

此方法有效,但需要禁用android.control.aeMode,因此白平衡将会关闭。

此外,我尝试使用标准场景模式,如CONTROL_SCENE_MODE_ACTIONCONTROL_SCENE_MODE_SPORTS,但曝光时间大约为40毫秒。

问题:是否可以使用camera2 intereace来限制传感器的曝光时间,s.t。白平衡是否活跃?

3 个答案:

答案 0 :(得分:1)

要求自动曝光保持低于某个最大曝光时间的主要API是CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE控件。例如,如果将其设置为(30,30),则相机设备可能不会使用超过1/30秒的曝光时间。

设备的可用范围列表由CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES提供。

没有直接控制自己设置最大/最小曝光值,如果没有可用的目标FPS范围限制曝光时间,你唯一的另一个选择是使用手动曝光控制(如果支持)。

遗憾的是,禁用AWB是否取决于设备 - 在某些设备上,自动曝光例程的输出对于白平衡算法的工作至关重要。

答案 1 :(得分:0)

查看Camera参数的setExposureCompensation()方法。

以下是网址https://developer.android.com/reference/android/hardware/Camera.Parameters.html#setExposureCompensation(int)

enter image description here

答案 2 :(得分:0)

您可以使用密钥SENSOR_INFO_EXPOSURE_TIME_RANGE

了解手机支持的下限和上限值

查看下一个方法:

/**
 * Get exposure time range.
 *
 * @param cameraCharacteristics The properties of the camera.
 * @return Long exposure compensation range.
 * @see <a href="https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#SENSOR_INFO_EXPOSURE_TIME_RANGE">
 * CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE</a>
 */
private static Range<Long> getExposureTimeRange(CameraCharacteristics cameraCharacteristics) {
    return cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE);
}