views:

59

answers:

2

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);
+1  A: 

Well, could you post some sample image of the result of GetBlobsEdgePoints, then it might be easier to understand what types if image processing algorithms are needed.

1) You may try a greedy algorithm, first pick a point at random, mark that point as "taken", pick the closest point not marked as "taken" and so on.
You need to find suitable termination conditions. If there can be several disjunct paths you need to find out a definition of how far away points need to be to be part of disjunct paths.

3) If you have a static background you can try to create a difference between two time shifted images, like 200ms apart. Just do a pixel by pixel difference and use abs(diff) as index in your heat color map. That will give more like an edge glow effect of moving objects.

Albin Sunnanbo
1. I'm not sure such an algorithm will be close enough for some nice fps? what would be a termination condition? take every n-th pixel between two points and see if there is an image there? 2. I added some code for the way i'm removing background. The problem is I need to paint the people not there edges with a colormap although i'm sure your idea would have produced a nice effect :)
tomato
1. The speed depends on how many points you have, the complexity is O(n^2), for 100 points or so it is quite reasonable for 1000 points you might be in trouble. Then you might need to a grid, maybe 25x25 squares and start finding the closet point in the same grid as your last point, and in adjacent grids if the closest point is too close to an edge.
Albin Sunnanbo
well actually i'm kinda looking into a different solution now, i'll draw fake radial gradient points on the blob assuming it's a person (head and hands) and just mask it by using getblobimage method.
tomato
A: 

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

tomato