9

カメラ アプリでホワイト バランスと温度の色にカスタム値を設定しようとしています。私は camera2 API を使用しており、この値を設定するさまざまな方法を試しています。100 ~ 100.000 のホワイト バランス値から適切な RGB 温度マトリックス [赤、緑、青] を取得する方法を Excel ファイルから見つけました。

このメソッドをシークバーに取り付けて正常に動作しました。白いものに焦点を合わせようとすると問題が発生し、ピンクになります。どんな種類の光でも、画面ではピンク色の松明のように見えます。

ここに画像の説明を入力

私はこのように値を設定しています:

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 のメソッドが正しくないためかもしれませんが、それを修正する方法が見つかりません。

4

2 に答える 2