点产品和亮度/ Findmyicone

所有,

我有一个基本的问题,我正在这里挣扎。 当您查看WWDC 2010的findmyicone示例代码时,您将看到:

static const uint8_t orangeColor[] = {255, 127, 0}; uint8_t referenceColor[3]; // Remove luminance static inline void normalize( const uint8_t colorIn[], uint8_t colorOut[] ) { // Dot product int sum = 0; for (int i = 0; i < 3; i++) sum += colorIn[i] / 3; for (int j = 0; j < 3; j++) colorOut[j] = (float) ((colorIn[j] / (float) sum) * 255); } 

然后它被称为:

 normalize(orangeColor, referenceColor); 

运行debugging器,它将BGRA :(红色255,绿色127,蓝色0)转换为(红色0,绿色255,蓝色0)。 我已经在网上看了,所以find亮度和点积的细节,并没有真正的信息。

1-有人可以指导我这个function在做什么?

2-你能指导我一些有用的话题/在线入门以及?

再次感谢九巴

他们试图做的是跟踪亮度变化的特定颜色,所以他们正在为颜色的亮度正常化。 我在基于来自Apple的GPU Gems论文的彩色跟踪示例中使用了片段着色器,以及我的GPUImage框架中的ColorObjectTracking示例应用程序。

 vec3 normalizeColor(vec3 color) { return color / max(dot(color, vec3(1.0/3.0)), 0.3); } vec4 maskPixel(vec3 pixelColor, vec3 maskColor) { float d; vec4 calculatedColor; // Compute distance between current pixel color and reference color d = distance(normalizeColor(pixelColor), normalizeColor(maskColor)); // If color difference is larger than threshold, return black. calculatedColor = (d > threshold) ? vec4(0.0) : vec4(1.0); //Multiply color by texture return calculatedColor; } 

上面的计算将三个颜色分量的平均值乘以每个通道三分之一,然后将它们相加(这就是点积在这里所做的)。 然后用这个平均值来划分每个颜色通道,以得到一个标准化的颜色。

计算这个归一化的颜色和目标颜色之间的距离,如果它在一个特定的阈值内,那么像素被标记为该颜色。

这只是确定一种颜色接近另一种颜色的一种方法。 另一种方法是将RGB值转换为Y,Cr和Cb(Y,U和V)分量,然后仅取出色度部分(Cr和Cb)之间的距离:

  vec4 textureColor = texture2D(inputImageTexture, textureCoordinate); vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2); float maskY = 0.2989 * colorToReplace.r + 0.5866 * colorToReplace.g + 0.1145 * colorToReplace.b; float maskCr = 0.7132 * (colorToReplace.r - maskY); float maskCb = 0.5647 * (colorToReplace.b - maskY); float Y = 0.2989 * textureColor.r + 0.5866 * textureColor.g + 0.1145 * textureColor.b; float Cr = 0.7132 * (textureColor.r - Y); float Cb = 0.5647 * (textureColor.b - Y); float blendValue = 1.0 - smoothstep(thresholdSensitivity, thresholdSensitivity + smoothing, distance(vec2(Cr, Cb), vec2(maskCr, maskCb))); 

这个代码是我在色度键控着色器中使用的,它是基于Apple在其中一个示例应用程序中使用的类似计算。 哪一个最好可以取决于你面对的特定情况。

Interesting Posts