'Draw ellipses on people using Expectation Maximization with OpenCV

I have a few doubts about how to approach my goal. I have an outside camera who is recording people and I want to draw an ellipse on every person.

Right now what I do is get the feature points of the people from the frame (I get them using a mask to only have the feature points on the people), set a EM algorithm and train it with my samples (the feature points extracted). The number of clusters is twice the number of people from the image (I get it before start the EM algorithm using other methods such as pixel counting with a codebook).

My question is

  • (a) Do I have to just train it only for the first frame and then use predict in the following frames? or,
  • (b) use train with the feature points in every frame?

Right now I am doing the option b) (I don't use predict) because I don't really know how to use the predict.

If I do a), can you help me with it and after that how to draw the ellipses?. If I do b), can you help me drawing an ellipse for every person? Since right know I got different ellipses for the same person using the cov, mean, etc (one for the arm, for example).

What I want to achieve is this paper using the Gaussian model: Link



Solution 1:[1]

If you would draw bounding boxes, rather then ellipses, you could use the function groupRectanlges to merge the different bounding boxes.

But, more important - for people detection, you can simply use openCV's person detector (based on HOG) or latent svm detector with the person model.

Solution 2:[2]

You should do b) anyway because, otherwise you'll try to match the keypoints to the clusters (persons) in the first frame. After a few seconds this would not be relevant.

It seems reasonable to assume that from frame to frame change is not going to be overwhelming, so reusing the results of the training on frame N-1 is a good seed to train on frame N, likely to converge faster that running EM from scratch on each frame.

in order to draw the ellipses you can leverage from the mixture of gaussian example in the python bindings:

https://github.com/opencv/opencv/blob/master/samples/python/gaussian_mix.py

Note if you use a diagonal covariance matrix, your ellipses are going to be aligned "straight", their own axis aligned with the X and Y axis of the frame, you can skip the calculation of the angle of the ellipse

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 GilLevi
Solution 2 Philippe Grassia