2

Silverlight 用の 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;

}

この例を表示するには、Web カメラを搭載したコンピューターが必要です。

  1. ページhttp://xmldocs.net/alphavideo/background.htmlに移動します
  2. [記録開始]を押します。
  3. シーンの外に体を移動し、[背景のキャプチャ] を押します。
  4. 次に、体をシーンに戻し、スライダーを使用して Toleance 値をシェーダーに合わせます。
4

1 に答える 1

2

EDIT

Single pixel isn't useful for such task, because of noise. So algorithm essence should be to measure similarity between pixel blocks. Recipe pseudo-code (based on correlation measurement):

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)

This is sequential pseudo code, but it could be easily converted to HLSL shader. Simply each pixel detects to which pixel block it belongs, and after that measures correlation between corresponding blocks. And based on that correlation shows or hides current pixel.

Try this approach, Good Luck !

于 2010-09-06T10:12:50.577 に答える