如何在Camera2中手动控制ISO,Android

9

我是一名新手,正在尝试探索最新的Android相机2效果。但我不知道如何在相机预览中手动控制ISO。

如果有人能够帮忙,将不胜感激。

谢谢。

2个回答

16

判断设备是否支持手动ISO控制的一种方法是检查其是否支持MANUAL_SENSOR功能。

如果是这样,您可以通过禁用所有自动设置来关闭自动曝光:

previewBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF);

或者只需禁用自动曝光,仍然保留自动对焦和自动白平衡功能:

previewBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);

一旦你关闭了自动曝光功能,你就可以手动控制曝光时间、灵敏度(ISO)和帧时长:

previewBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, exposureTime);
previewBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, sensitivity);
previewBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, frameDuration);

这些值的有效范围可以从 SENSOR_INFO_EXPOSURE_TIME_RANGESENSOR_INFO_SENSITIVITY_RANGE 中找到,用于曝光和灵敏度。对于帧持续时间,最大帧持续时间可以在SENSOR_INFO_MAX_DURATION中找到,而最小帧持续时间(最大帧速率)取决于会话输出配置。有关此事的更多详细信息,请参见StreamConfigurationMap.getOutputMinFrameDuration

请注意,一旦禁用了AE,您必须控制所有3个参数(如果您从未设置过某个参数,则有默认值,但它们不会自动变化)。 您可以从关闭AE之前的最后一个CaptureResult中复制这些参数的最后一个好值作为起点。


请问您能帮我解答关于MANUAL_SENSOR的问题吗?链接为http://stackoverflow.com/questions/40343626/which-kind-of-device-sopport-info-supported-hardware-level-full。谢谢! - Sirop4ik
嗨,@Eddy Talvala。我有一个关于相机2手动传感器的问题。您能否看一下这个链接:http://stackoverflow.com/questions/41298161/how-to-implement-camera-brightness-changing-using-seekbar-on-camera-2-api-on-and 谢谢 - Dylan
1
@Eddy Talvala 我熟悉Camera1 API,希望尽快开始使用Camera2。在Camera1 API中,只能设置支持的ISO值之一。使用Camera2 API可以手动设置任何ISO值吗?拍照后是否可以获取实际的ISO值?我想previewBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, sensitivity)是用于手动设置任何整数的。您可以从onPictureTaken(byte[] data)方法中获取数据以获得实际的ISO值。 - Thracian
1
支持的灵敏度值的有效范围由 https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#SENSOR_INFO_SENSITIVITY_RANGE 提供。实际使用的灵敏度在图像的捕获结果中提供,位于 https://developer.android.com/reference/android/hardware/camera2/CaptureResult.html#SENSOR_SENSITIVITY。这些仅适用于支持手动控制或传感器设置读取的设备:https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html#REQUEST_AVAILABLE_CAPABILITIES。 - Eddy Talvala
@EddyTalvala,你能帮我看看这个问题吗:https://stackoverflow.com/questions/68529131/camera-2-manually-checking-if-iso-and-shutter-speed-are-supported - Mohammad Elsayed

2

您需要先设置previewbuilder,方法如下:

mPreviewBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.INFO_SUPPORTED_HARDWARE_LEVEL_FULL);

然后

Range<Integer> range2 = characteristics.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE);
                    int max1 = range2.getUpper();//10000
                    int min1 = range2.getLower();//100
                    int iso = ((progress * (max1 - min1)) / 100 + min1);
                    mPreviewBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, iso);

progress是一个变量,用于从onProgressChanged(SeekBar seekBar, int progress, boolean user)重写方法中获取seekBar的进度。


使用INFO_SUPPORTED_HARDWARE中的int设置CONTROL_MODE是不正确的。如果枚举值对齐,你可能会有好运气,但这并没有真正意义。请在此处使用一个实际的CONTROL_MODE枚举,例如CONTROL_MODE_OFF。 - Eddy Talvala
对不起,Eddy是完全正确的,我在复制过程中犯了错误! - user0770
@user0770,你能帮我吗?https://stackoverflow.com/questions/68529131/camera-2-manually-checking-if-iso-and-shutter-speed-are-supported - Mohammad Elsayed

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