Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 用于减去背景图像的HLSL着色器_Silverlight_Silverlight 4.0_Hlsl_Pixel Shader - Fatal编程技术网

Silverlight 用于减去背景图像的HLSL着色器

Silverlight 用于减去背景图像的HLSL着色器,silverlight,silverlight-4.0,hlsl,pixel-shader,Silverlight,Silverlight 4.0,Hlsl,Pixel Shader,我正在尝试使用Silverlight的HLSL像素着色器从视频图像中减去背景图像。有谁能建议一个比我现在使用的更复杂的算法,因为我的算法做得不正确 float Tolerance : register(C1); SamplerState ImageSampler : register(S0); SamplerState BackgroundSampler : register(S1); struct VS_INPUT { float4 Position : POSITION;

我正在尝试使用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;

}
浮动公差:寄存器(C1);
采样器状态图像采样器:寄存器(S0);
采样器状态背景采样器:寄存器(S1);
结构与输入
{
浮动位置4:位置;
float4漫反射:COLOR0;
浮动2 UV0:TEXCOORD0;
浮动2 UV1:TEXCOORD1;
};
结构与输出
{
浮动位置4:位置;
float4颜色:COLOR0;
float2uv:TEXCOORD0;
};
浮动4 PS(VS_输出输入):SV_目标
{
float4 color=tex2D(ImageSampler,input.UV);
float4 background=tex2D(BackgroundSampler,input.UV);
如果(abs(background.r-color.r)编辑

由于噪声的影响,单个像素对于此类任务没有用处。因此,算法的本质应该是测量像素块之间的相似性。配方伪代码(基于测量):

将图像划分为N x M网格 对于网格中的每个N,M单元: 相关性=(N,M)的(信号像素)之间的相关性, 背景像素(N,M) ); 如果(相关性>阈值) 显示背景单元格(N,M) 其他的 显示信号单元(N,M) 这是顺序伪代码,但很容易转换为HLSL着色器。只需每个像素检测它所属的像素块,然后测量相应块之间的相关性。并根据该相关性显示或隐藏当前像素

试试这个办法,,
祝你好运!

你能解释一下它到底是如何“做得不正确”的吗?我不得不说,我很惊讶你的着色器能正常工作。看看这个HLSL中自适应背景减法的例子: 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)