我试图为我的相机应用中的白平衡和温度颜色设置自定义值。 我使用camera2 API和Im尝试不同的方式来设置此值。 我从excel文件中找到了一个方法,可以从100到100.000之间的白平衡值获得正确的RGB温度矩阵[红,绿,蓝]。
我将这种方法附加到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的方法是不正确的,但我找不到解决它的方法。 希望有人对此有所了解!
非常感谢你提前。
I'm trying to set a custom value for the White Balance & temperature color in my camera app. I'm using camera2 API and I'm 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.
I'm 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 it's because the method of my CaptureRequest is not correct, but I don't find a way to fix it.
最满意答案
它将模板更改为Still_capture或Manual Template并使用下一个方法后工作:
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); }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); }更多推荐
方法,CaptureRequest,set,电脑培训,计算机培训,IT培训"/> <meta name="descrip
发布评论