Camera2 API设置自定义白平衡和温度颜色(Camera2 API Set Custom White Balance & Temperature Color)

编程入门 行业动态 更新时间:2024-10-26 01:23:40
Camera2 API设置自定义白平衡和温度颜色(Camera2 API Set Custom White Balance & Temperature Color)

我试图为我的相机应用中的白平衡和温度颜色设置自定义值。 我使用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

本文发布于:2023-08-03 00:37:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1382502.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:自定义   白平衡   温度   颜色   API

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!