Search code examples
c#imageblobmotion-detectionaforge

Faking thermal image camera with aforge or any other .net solution , emgucv, tbeta


I am simulating a thermal camera effect. I have a webcam at a party pointed at people in front of a wall. I went with background subtraction technique and using Aforge blobcounter I get blobs that I want to fill with gradient coloring. My problem = GetBlobsEdgePoints doesn't return sorted point cloud so I can't use it with, for example, PathGradientBrush from GDI+ to simply draw gradients.

  1. I'm looking for simple,fast, algorithm to trace blobs into path (can make mistakes).
  2. A way to track blobs received by blobcounter.
  3. A suggestion for some other way to simulate the effect.

I took a quick look at Emgu.CV.VideoSurveillance but didn't get it to work (examples are for v1.5 and I went with v2+) but I gave up because people say it's slow on forums.

thanks for reading.

sample code of aforge background removal

            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);

Solution

  • This is the direction i'm going to take (looks best for now):

    1. Define a set of points on the blob by my own logic (color of skin blobs should be warmer etc..)
    2. draw gradients around those points

                  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. mask those gradients with blob shape

                  blobCounter.ExtractBlobsImage(bmp,blob,true);
                  mask.OverlayImage = blob.Image;
                  mask.ApplyInPlace(rslt);
      
    4. colorize with color remapping

    tnx for the help @Albin