Francisco Durdin Garcia - 9 months ago 51

Android Question

Im trying to set a custom value for the White Balance & temperature color in my camera app. Im using camera2 API and Im trying different ways to set this value. I found a method from a excel file to get the right RGB Temperature matrix [Red,Green,Blue] from the White Balance Value between 100 and 100.000.

I attached this method to a Seekbar and its working fine, my problem appear when I try to focus something white, then it becomes pink. Any kind of light looks like a pink torch in the screen.

Im setting the values in this way:

`mPreviewRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, CaptureRequest.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX);`

RggbChannelVector rggb = getTemperatureVector(seekBackSelectedTemperature);

mPreviewRequestBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, myRggbChannelVector);

In other way, my method to get the matrix is this one:

`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;

}

Maybe its cause the method of my CaptureRequest is not correct, but I dont find the way to fix it. Hope that someone have some idea about it!

Thank you very much in advance.

Answer Source

It worked after change the template to Still_capture or Manual Template and use the next method:

```
captureBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_OFF);
// adjust color correction using seekbar's params
captureBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, CaptureRequest.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX);
captureBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, CameraCapabilities.colorTemperature(Integer.parseInt(awbMode)));
public static RggbChannelVector colorTemperature(int whiteBalance) {
float temperature = whiteBalance / 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) green, -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;
}
Log.v(TAG, "red=" + red + ", green=" + green + ", blue=" + blue);
return new RggbChannelVector((red / 255) * 2, (green / 255), (green / 255), (blue / 255) * 2);
}
```