#android-camera2 #exposure
#android-camera2 #экспозиция
Вопрос:
Мой код задает все характеристики экспозиции.
Две проблемы:
-
Когда я запускаю код на Pixel 3 (Android 10), полученное изображение выглядит почти на 2 ступени светлее, чем та же сцена, снятая на OnePlus 6T (Android 9.0).). Проверка результирующих данных EXIF показывает идентичные настройки экспозиции на обоих изображениях.
-
Я попытался принудительно настроить кривую гаммы, установив кривые tonempap, думая, что это может быть источником разницы, но, похоже, это не работает ни на одном устройстве (на основе установки gamma на 1, что должно привести к очень плоскому изображению).
Любые / все предложения приветствуются! Я в ТУПИКЕ.
set(requestBuilder,CaptureRequest.CONTROL_MODE,CONTROL_MODE_AUTO );
set(requestBuilder,CaptureRequest.CONTROL_CAPTURE_INTENT, CONTROL_CAPTURE_INTENT_MANUAL);
set(requestBuilder,CaptureRequest.CONTROL_AE_MODE,CONTROL_AE_MODE_OFF);
set(requestBuilder,CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
set(requestBuilder,CaptureRequest.SENSOR_EXPOSURE_TIME, (long) (exposureSettings.shutterSpeed * nanosPerSecond));
set(requestBuilder,CaptureRequest.LENS_APERTURE, exposureSettings.fStop);
set(requestBuilder,CaptureRequest.SENSOR_SENSITIVITY, Math.round(exposureSettings.iso));
setGamma(requestBuilder, 1.0f); //fixme:
set(requestBuilder,CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION,0);
set(requestBuilder,CaptureRequest.CONTROL_AF_MODE,CONTROL_AF_MODE_OFF);
set(requestBuilder,CaptureRequest.LENS_FOCUS_DISTANCE,0.0f);// infinity
set(requestBuilder,CaptureRequest.CONTROL_AWB_MODE,CONTROL_AWB_MODE_DAYLIGHT);
set(requestBuilder,CaptureRequest.LENS_FOCAL_LENGTH, availableFocalLengths[0]);//todo:support multiple focal lengths.
requestBuilder.addTarget(imageCaptureSurface);
imageCaptureRequest = requestBuilder.build();
//
//
public <T> void set(@NonNull CaptureRequest.Builder requestBuilder,
@NonNull CaptureRequest.Key<T> key,
T value)
{ Log.d(TAG,String.format("requestBuilder.set(key:%s = %s)",key.getName(),value));
requestBuilder.set(key, value);
}
//
static CaptureRequest.Builder setGamma(CaptureRequest.Builder builder,
float gamma)
{ int curveSize = 16;
builder.set(CaptureRequest.TONEMAP_MODE,
CaptureRequest.TONEMAP_MODE_CONTRAST_CURVE);
setToneMapCurves(builder,
gammaCurve(gamma,curveSize), //red
gammaCurve(gamma,curveSize), //green
gammaCurve(gamma,curveSize)); //blue all same.
return builder;
}
//
static CaptureRequest.Builder setToneMapCurves(CaptureRequest.Builder builder,
float[] redCurve,
float[] greenCurve,
float[] blueCurve)
{ TonemapCurve toneMapCurve = new TonemapCurve(redCurve,greenCurve,blueCurve);
builder.set(CaptureRequest.TONEMAP_CURVE,toneMapCurve);
return builder;
}
//
private static float[] gammaCurve(float gamma, int numPoints)
{ int idx = 0;
Log.i(TAG, String.format("Using gamma of %f to build tone map curve.",gamma));
if (gamma > 0)
{ float curve[] = new float[numPoints*2];//
for (float inValue = 0f; inValue <= 1.0f; inValue = 1.0f / (numPoints - 1))
{
curve[idx ] = inValue;
curve[idx ] = (float) Math.pow(inValue, gamma);
if (debug)
Log.d(TAG, String.format("Added tone curve point [%d]:(%f, %f)",
idx - 2, inValue, curve[idx - 1]));
}
return curve;
}
// sRGB curve approximates gamma = 1/2.2, with small linear front.
if (gamma == -1.0f) //sRGB
{ float curve[] =
{ 0.0000f, 0.0000f, //stick the small linear section in here
0.0667f, 0.2864f,
0.1333f, 0.4007f,
0.2000f, 0.4845f,
0.2667f, 0.5532f,
0.3333f, 0.6125f,
0.4000f, 0.6652f,
0.4667f, 0.7130f,
0.5333f, 0.7569f,
0.6000f, 0.7977f,
0.6667f, 0.8360f,
0.7333f, 0.8721f,
0.8000f, 0.9063f,
0.8667f, 0.9389f,
0.9333f, 0.9701f,
1.0000f, 1.0000f
};
return curve;
}
return null;
}
Комментарии:
1. Может ли это быть связано с проблемой, о которой сообщалось: github.com/flutter/flutter/issues/24575
Ответ №1:
Вы не устанавливаете значение чувствительности ISO, поэтому оно может иметь разные значения по умолчанию на двух устройствах. Кроме того, OnePlus 6T имеет диафрагму камеры f / 1.7, в то время как диафрагма Pixel 3 составляет f / 1.8.
Оба устройства с фиксированной диафрагмой, поэтому они будут вводить разницу в яркости 1,8 ^ 2/1,7 ^ 2 = 1,12x между двумя изображениями, даже при одинаковых настройках экспозиции и чувствительности.
Постобработка также может быть фактором, поэтому лучшим сравнением будет результат RAW. В основном это может вызвать беспокойство, если устройство реализует автоматическую HDR или аналогичную обработку, но при ручном управлении это маловероятно.