Camera2 API Set Custom Баланс белого и цветовая температура
Я пытаюсь установить пользовательское значение для баланса белого и цветовой температуры в приложении камеры. Я использую camera2 API и пытаюсь установить это значение разными способами. Я нашел метод из файла Excel, чтобы получить правильную матрицу температуры RGB [красный, зеленый, синий] из значения баланса белого между 100 и 100.000.
Я прикрепил этот метод к Seekbar, и он работает нормально, моя проблема появляется, когда я пытаюсь сфокусировать что-то белое, затем оно становится розовым. Любой вид света выглядит как розовый факел на экране.
Я устанавливаю значения следующим образом:
mPreviewRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, CaptureRequest.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX);
RggbChannelVector rggb = getTemperatureVector(seekBackSelectedTemperature);
mPreviewRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, myRggbChannelVector);
Другими словами, мой метод получения матрицы такой:
public static RggbChannelVector getTemperatureVector (int WhiteBalanceValue){
float InsertTemperature = WhiteBalanceValue;
float temperature = InsertTemperature / 100;
float red;
float green;
float blue;
//Calculate red
if (temperature <= 66)
red = 255;
else {
red = temperature - 60;
red = (float) (329.698727446 * (Math.pow((double) red, -0.1332047592)));
if (red < 0)
red = 0;
if (red > 255)
red = 255;
}
//Calculate green
if (temperature <= 66) {
green = temperature;
green = (float) (99.4708025861 * Math.log(green) - 161.1195681661);
if (green < 0)
green = 0;
if (green > 255)
green = 255;
} else
green = temperature - 60;
green = (float) (288.1221695283 * (Math.pow((double) red, -0.0755148492)));
if (green < 0)
green = 0;
if (green > 255)
green = 255;
//calculate blue
if (temperature >= 66)
blue = 255;
else if (temperature <= 19)
blue = 0;
else {
blue = temperature - 10;
blue = (float) (138.5177312231 * Math.log(blue) - 305.0447927307);
if (blue < 0)
blue = 0;
if (blue > 255)
blue = 255;
}
RggbChannelVector finalTemperatureValue = new RggbChannelVector(red/255,(green/255)/2,(green/255)/2,blue/255);
return finalTemperatureValue;
}
Может быть, это потому, что метод моего CaptureRequest неверен, но я не могу найти способ это исправить.