2010-08-06 4 views
2

Silverlight 용 HLSL 픽셀 쉐이더를 사용하여 비디오 이미지에서 배경 이미지를 뺍니다. 누구든지 내 알고리즘이 올바르게하고 있지 않기 때문에 내가 사용하고있는 것보다 더 정교한 알고리즘을 제안 할 수 있습니까? 배경 이미지를 빼는 HLSL 쉐이더

float Tolerance : register(C1); 
SamplerState ImageSampler : register(S0); 
SamplerState BackgroundSampler : register(S1); 

struct VS_INPUT 
{ 
    float4 Position : POSITION; 
    float4 Diffuse : COLOR0; 
    float2 UV0  : TEXCOORD0; 
    float2 UV1  : TEXCOORD1; 
}; 

struct VS_OUTPUT 
{ 
    float4 Position : POSITION; 
    float4 Color  : COLOR0; 
    float2 UV  : TEXCOORD0; 
}; 


float4 PS(VS_OUTPUT input) : SV_Target 
{ 
    float4 color = tex2D(ImageSampler, input.UV); 
    float4 background = tex2D(BackgroundSampler, input.UV); 

    if (abs(background.r - color.r) <= Tolerance && 
        abs(background.g - color.g) <= Tolerance && 
        abs(background.b - color.b) <= Tolerance) 
    { 
     color.rgba = 0; 
    } 

    return color; 

} 

이의 예를 확인하려면, 당신은 웹캠으로 컴퓨터가 필요 :

  1. 페이지 http://xmldocs.net/alphavideo/background.html
  2. 을 눌러 [녹화 시작]로 이동합니다.
  3. 장면에서 몸을 움직여 [배경 캡처]를 누릅니다.
  4. 그런 다음 본문을 다시 장면으로 이동하고 슬라이더를 사용하여 Toleance 값을 쉐이더로 조정하십시오.
+0

정확히 "올바르게하지 못하고"얼마나 정확합니까? 그리고 당신의 쉐이더가 전혀 작동하지 않는다는 것에 놀랐다. – Denis

+0

HLSL의 적응 형 배경 제거에 대한 다음 예제를 살펴보십시오. http://vvvv.org/forum/adaptive-background-substraction – appas

답변

2

편집

단일 픽셀 때문에 소음 등 작업에 유용하지 않습니다. 따라서 알고리즘 에센스는 픽셀 블록 간의 유사성을 측정해야합니다. (correlation 측정 기준) 레시피 의사 코드 :

 
Divide image into N x M grid 
For each N,M cell in grid: 
    correlation = correlation_between(signal_pixels_of(N,M), 
            background_pixels_of(N,M) 
            ); 
    if (correlation > threshold) 
     show_background_cell(N,M) 
    else 
     show_signal_cell(N,M) 

이 순차적 의사 코드이지만, 쉽게 HLSL 쉐이더로 변환 할 수 있습니다. 간단히 각 픽셀은 자신이 속한 픽셀 블록을 감지하고 해당 픽셀 간의 상관 관계를 측정합니다. 그리고 그 상관 관계를 기반으로 현재 픽셀을 표시하거나 숨 깁니다.

이 접근 방식을 시도해보십시오. 행운을 비네!

관련 문제