1

全て、

ここで苦労している基本的な質問があります。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);

デバッガーを実行すると、BGRA:(Red 255、Green 127、Blue 0)が(Red 0、Green 255、Blue 0)に変換されます。輝度とドット積の詳細を見つけるためにWebとSOを調べましたが、実際には情報がありません。

1-誰かがこの関数が何をしているのか教えてもらえますか?

2-オンラインでも役立つトピック/入門書を教えていただけますか?

もう一度ありがとうKMB

4

1 に答える 1

4

彼らがやろうとしているのは、明るさの変化全体で特定の色を追跡することです。そのため、彼らは色の輝度を正規化しています。AppleのGPUGemsペーパーに基づくカラートラッキングの例で使用しているフラグメントシェーダーと、 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;
}

上記の計算では、各チャネルに1/3を掛けてからそれらを合計することにより、3つの色成分の平均を取ります(これがドット積がここで行うことです)。次に、各カラーチャネルをこの平均で除算して、正規化された色に到達します。

この正規化された色とターゲットの色の間の距離が計算され、それが特定のしきい値内にある場合、ピクセルはその色であるとマークされます。

これは、ある色から別の色への近さを判断する1つの方法にすぎません。もう1つの方法は、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がサンプルアプリケーションの1つで使用しているのと同様の計算に基づいています。どちらが最適かは、直面している特定の状況によって異なります。

于 2012-10-11T20:16:00.330 に答える