Ios 点积和亮度/Findmyicone

Ios 点积和亮度/Findmyicone,ios,opengl-es,avfoundation,avcapturesession,luminance,Ios,Opengl Es,Avfoundation,Avcapturesession,Luminance,全部, 我有一个基本的问题,我在这里挣扎。当您查看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 produ

全部,

我有一个基本的问题,我在这里挣扎。当您查看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);
}
运行调试器时,它正在将BGRA:(红色255,绿色127,蓝色0)转换为(红色0,绿色255,蓝色0)。我在网上查了一下,想找到关于亮度和网点产品的详细信息,但实际上没有任何信息

1-有人能指导我这个函数在做什么吗

2-你能在线指导我一些有用的主题/初级读物吗

再次感谢
KMB试图做的是跟踪亮度变化中的特定颜色,因此他们正在对颜色的亮度进行标准化。我在中使用的片段着色器以及框架中的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;
}
上面的计算是通过将每个通道乘以1/3,然后求和得到三个颜色分量的平均值(这就是点积的作用)。然后,它将每个颜色通道除以此平均值,以获得标准化颜色

计算该标准化颜色和目标颜色之间的距离,如果该距离在某个阈值内,则该像素被标记为该颜色

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


这段代码就是我在色度键控着色器中使用的代码,它基于苹果在其一个示例应用程序中使用的类似计算。哪种颜色最好取决于您所面临的特定情况。

他们试图做的是跟踪亮度变化中的特定颜色,以便对颜色的亮度进行标准化。我在中使用的片段着色器以及框架中的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;
}
上面的计算是通过将每个通道乘以1/3,然后求和得到三个颜色分量的平均值(这就是点积的作用)。然后,它将每个颜色通道除以此平均值,以获得标准化颜色

计算该标准化颜色和目标颜色之间的距离,如果该距离在某个阈值内,则该像素被标记为该颜色

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


这段代码就是我在色度键控着色器中使用的代码,它基于苹果在其一个示例应用程序中使用的类似计算。哪一个最好取决于你所面临的具体情况。

Brad,谢谢。这里有很多信息。我正在深入研究你的色彩追踪应用程序和视频,并将带着评论/问题回来。谢谢你,谢谢。这里有很多信息。我正在深入研究你的色彩追踪应用程序和视频,并将带着评论/问题回来。谢谢
 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)));