HLSL шейдер для вычитания фонового изображения - PullRequest
2 голосов
/ 06 августа 2010

Я пытаюсь заставить пиксельный шейдер HLSL для Silverlight работать, чтобы вычесть фоновое изображение из видеоизображения.Может кто-нибудь предложить более сложный алгоритм, чем я использую, потому что мой алгоритм не делает это правильно?

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 Ответ

2 голосов
/ 06 сентября 2010

EDIT

Одиночный пиксель для такой задачи бесполезен из-за шума. Так что суть алгоритма должна заключаться в измерении сходства между пиксельными блоками. Псевдокод рецепта (на основе корреляция измерение):

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. Просто каждый пиксель определяет, к какому пиксельному блоку он принадлежит, и после этого измеряет корреляцию между соответствующими блоками. И на основании этой корреляции показывает или скрывает текущий пиксель.

Попробуйте этот подход, Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...