代码之家  ›  专栏  ›  技术社区  ›  Michael S. Scherotter

要减去背景图像的HLSL着色器

  •  2
  • Michael S. Scherotter  · 技术社区  · 15 年前

    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. 将身体移出场景,然后按[捕获背景]。
    1 回复  |  直到 15 年前
        1
  •  2
  •   Agnius Vasiliauskas    15 年前

    编辑

    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着色器。简单地说,每个像素检测它属于哪个像素块,然后测量相应块之间的相关性。基于这种相关性显示或隐藏当前像素。

    祝你好运!