Background Subtraction with changing light


I am trying to build up people counter … but the camera is very low and near a spot light…when someone enters , takes all the light from the spot light and reflects the light everywhere…making the MOG2 going crazy !!

You can see what happens in this video:

Any Idea on how to improve background subtraction ?

I thought to evaluate over all frames the total average light (AV_light) and then the light for the current frame (CU_light) and the difference Diff_light=CU_light - AV_light

then I could do:
New_Current_Mat = Current_Mat + cv::Scalar(Diff_light,Diff_light,Diff_light);

what do Yout Think?

Any other smarter Idea?

Any other better background subtraction other MOG2?



Perhaps this method:
Take only a part of the camera image, for example the part bounded by the green rectangle in your youtube video

  • (1) compute the difference level between the current frame and a frame where nobody is present.
  • when the difference level is higher than a threshold, increase the counter.
  • wait for the difference level to come back smaller than the threshold.
  • goto (1)

The difference level should be a number which give you the similarity between 2 frames. I don’t know a convenient or efficient method to compute it with opencv, but I guess it’s not difficult. Perhaps compute the difference between the 2 frames, pixel by pixel, then sum all the pixels values from this difference?

I gave it a simple try: (2.2 KB)
I don’t use opencv to compute the difference level, I just average the absolute difference between two ofPixels frames.
Seems to work.