Подделка тепловизионной камеры с помощью aforge или любого другого решения .net, emgucv, tbeta - PullRequest
1 голос
/ 22 августа 2010

Я имитирую эффект тепловой камеры. У меня есть веб-камера на вечеринке, направленной на людей перед стеной. Я пошел с техникой вычитания фона и используя Aforge blobcounter, я получил капли, которые я хочу заполнить градиентной окраской. Моя проблема = GetBlobsEdgePoints не возвращает отсортированное облако точек, поэтому я не могу использовать его, например, с PathGradientBrush из GDI +, чтобы просто рисовать градиенты.

  1. Я ищу простой, быстрый алгоритм для отслеживания капель на пути (может ошибаться).
  2. Способ отслеживания BLOB-объектов, полученных blobcounter.
  3. Предложение по другому способу моделирования эффекта.

Я быстро взглянул на Emgu.CV.VideoSurveillance, но не получил его к работе (примеры для v1.5, а я пошел с v2 +), но я сдался, потому что на форумах люди говорят, что он медленный

спасибо за чтение.

пример кода удаления фона aforge

            Bitmap bmp =(Bitmap)e.VideoFrame.Clone();
        if (backGroundFrame == null)
        {
            backGroundFrame = (Bitmap)e.VideoFrame.Clone();
            difference.OverlayImage = backGroundFrame;
        }

        difference.ApplyInPlace(bmp);
        bmp = grayscale.Apply(bmp);
        threshold.ApplyInPlace(bmp);

Ответы [ 2 ]

1 голос
/ 22 августа 2010

Хорошо, не могли бы вы опубликовать пример изображения результата GetBlobsEdgePoints, тогда было бы легче понять, какие типы требуются алгоритмы обработки изображения.

1) Вы можете попробовать жадный алгоритм, сначала выбрать случайную точку, пометить эту точку как «взятую», выбрать ближайшую точку, не помеченную как «принятую», и т. Д.
Вам необходимо найти подходящие условия расторжения. Если может быть несколько непересекающихся путей, вам необходимо выяснить, как далеко должны находиться точки, чтобы быть частью непересекающихся путей.

3) Если у вас статический фон, вы можете попытаться создать разницу между двумя смещенными во времени изображениями, например, на расстоянии 200 мс друг от друга. Просто сделайте попиксельное различие и используйте abs (diff) в качестве индекса в вашей цветовой карте. Это будет больше похоже на эффект краевого свечения движущихся объектов.

0 голосов
/ 23 августа 2010

Это направление, в котором я собираюсь идти (пока выглядит лучше):

  1. Определить набор точек на капле по моей собственной логике (цвет капель кожи должен быть теплее и т. Д.)
  2. рисовать градиенты вокруг этих точек

                GraphicsPath gp=new GraphicsPath();
                var rect = new Rectangle(CircumferencePoint.X - radius, CircumferencePoint.Y - radius, radius*2, radius*2);
                gp.AddEllipse(rect);
                GradientShaper = new PathGradientBrush(gp);
                GradientShaper.CenterColor = Color.White;
                GradientShaper.SurroundColors = surroundingColors;
                drawBmp.FillPath(GradientShaper,gp);
    
  3. маскировать эти градиенты с помощью формы капли

                blobCounter.ExtractBlobsImage(bmp,blob,true);
                mask.OverlayImage = blob.Image;
                mask.ApplyInPlace(rslt);
    
  4. раскрасить с помощью переназначения цветов

tnx за помощь @ Альбин

...