HLSL着色器减去背景图像

时间:2010-08-06 00:24:01

标签: silverlight silverlight-4.0 hlsl pixel-shader

我正在尝试让Silverlight的HLSL Pixel Shader工作以从视频图像中减去背景图像。任何人都可以建议比我使用更复杂的算法,因为我的算法没有正确地做到这一点?

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值。

1 个答案:

答案 0 :(得分: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着色器。简单地说,每个像素检测它属于哪个像素块,然后测量相应块之间的相关性。并且基于该相关性显示或隐藏当前像素。

尝试这种方法, 祝你好运!