我在我的应用程序中使用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);
但它仍然显示预览为暗图像,如下所示。
在此处查看不同之处:
我需要在第二个参数中传递的值是什么:
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 6);
我保持6,因为正如doc的建议:
例如,如果曝光值(EV)步长为0.333,则“6”表示+2 EV的曝光补偿; -3表示曝光补偿为-1 EV。
但亮度仍然没有影响..
答案 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);
它使预览变得更加明亮。