2012-10-10 6 views
1

모두도트 제품 및 광도/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); 
} 

을 그리고 그것이라고 : 당신이 WWDC 2010에서 findmyicone 샘플 코드를 보면, 당신이 볼 수

normalize(orangeColor, referenceColor); 

디버거를 실행, 그것은 BGRA 변환된다 (레드 255, 녹색 127, 파란색 0) ~ (빨간색 0, 녹색 255, 파란색 0). 휘도 및 내 제품에 대한 세부 정보를 찾기 위해 웹 및 SO를 검토했으며 실제로 정보가 없습니다.

1-이 기능의 수행 과정에 대한 안내를받을 수 있습니까?

2- 온라인으로 도움이되는 주제/입문서를 안내해 줄 수 있습니까?

다시 한번 감사 KMB

답변

3

무엇 그들이하려는 것은 밝기의 변화를 통해 특정 색상을 추적, 그래서 그들은 색상의 휘도 정상화하고 있습니다. 내 GPUImage 프레임 워크에 내가 a color tracking example based on a GPU Gems paper from Apple에서 사용하는 프레 그먼트 쉐이더에서 비슷한뿐만 아니라 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 그리고 나서 그것들을 더한다. 그런 다음 각 색상 채널을이 평균으로 나눠 정규화 된 색상을 얻습니다.

이 정규화 된 색상과 대상 사이의 거리가 계산되고 특정 임계 값 내에 있으면 픽셀이 해당 색상으로 표시됩니다.

이것은 한 색상의 근접성을 결정하는 한 가지 방법 일뿐입니다. 또 다른 방법은 Y, CR, CB를에 RGB 값으로 변환하는 (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))); 

이 코드는 크로마 키잉 쉐이더 (chroma keying shader)에서 사용하는 것과 애플이 샘플 애플리케이션 중 하나에서 사용하는 유사한 계산을 기반으로합니다. 어느 것이 가장 적합한지는 당신이 직면하고있는 특정 상황에 달려 있습니다.

+0

Brad, Thanks. 여기에 많은 정보가 있습니다. 귀하의 ColorTracking 응용 프로그램과 비디오를 파고 들며 코멘트/질문과 함께 돌아올 것입니다. 감사 – Spectravideo328