1

Short introduction: project of augmented reality

Goal: load 3D hairstyles templates on the head of someone.

So I am using OpenCV to track the face of the person, then I have to track the cap (We assume that the user has a cap and we can decide of a landmark or everything we need on the cap to detect it) of the user. Once I detected the landmark, I have to get the coordinates of the landmark, and then send it to the 3D engine to launch/update the 3D object.

So, to detect precisely the landmark(s) of the cap I tested a few methods first:

I came to you today to think about it with you. Do I need special landmark on the cap ? (If yes Which one ? If not, How can I do ?) Is it a good idea to mix up the detection of colors and detection of form ?

.... Am i on the right way ? ^^ I appreciate any advice regarding the use of a cap to target the head of the user, and the different functions I have to use in OpenCV library.

Sorry for my english if it's not perfect.

Thank you a lot !

user988168
  • 129
  • 2
  • 12

1 Answers1

3

A quick method, off the top of my head, is to combine both method.

Color tracking using histograms and mean shift

Here is an alternative color detection method using histogram: Robust Hand Detection via Computer Vision

The idea is this: For a cap of known color, say bright green/blue (like the kind of colors you see for image matting screen), you can pre-compute a histogram using just the hue and saturation color channels. We deliberately exclude the lightness channel to make it more robust to lighting variations. Now, with the histogram, you can create a back projection map i.e. a mask with a probability value at each pixel in the image indicating the probability that the color there is the color of the cap.

Now, after obtaining the probability map, you can run the meanshift or camshift algorithms (available in OpenCV) on this probability map (NOT the image), with the initial window placed somewhere above the face you detected using OpenCV's algorithm. This window will eventually end up at the mode of the probability distribution i.e. the cap.

Details are in the link on Robust Hand Detection I gave above. For more details, you should consider getting the official OpenCV book or borrowing it from your local library. There is a very nice chapter on using meanshift and camshift for tracking objects. Alternatively, just search the web using any queries along meashift/camshift for object tracking.

Detect squares/circles to get orientation of head

If in addition you wish to further confirm this final location, you can add 4 small squares/circles on the front of the cap and use OpenCV's built in algorithm to detect them only in this region of interest (ROI). It is sort of like detecting the squares in those QR code thing. This step further gives you information on the orientation of the cap and hence, the head, which might be useful when you render the hair. E.g. after locating 2 adjacent squares/circles, you can compute the angle between them and the horizontal/vertical line.

You can detect squares/corners using the standard corner detectors etc in OpenCV. For circles, you can try using the HoughCircle algorithm: http://docs.opencv.org/modules/imgproc/doc/feature_detection.html#houghcircles

Speeding this up

Make extensive use of Region of Interests (ROIs)

To speed things up, you should, as often as possible, run your algorithm on small regions of the image(ROIs) (also the probability map). You can extract ROI from OpenCV image, which are themselves images, and run OpenCV's algorithms on them the same way you would run them on whole images. For e.g., you could compute the probability map for an ROI around the detected face. Similarly, the meanshift/camshift algorithm should only be run on this smaller map. Likewise for the additional step to detect squares or circles. Details can be found in the OpenCV book as well as quick search online.

Compile OpenCV with TBB and CUDA

A number of OpenCV's algorithm can achieve significant speed ups WITHOUT the programmer needing to do any additional work simply by compiling your OpenCV library with TBB (Thread building blocks) and CUDA support switched on. In particular, the face detection algorithm in OpenCV (Viola Jones) will run a couple times faster.

You can switch on these options only after you have installed the packages for TBB and CUDA.

TBB: http://threadingbuildingblocks.org/download

CUDA: https://developer.nvidia.com/cuda-downloads

And then compile OpenCV from source: http://docs.opencv.org/doc/tutorials/introduction/windows_install/windows_install.html#windows-installation

Lastly, I'm not sure whether you are using the "C version" of OpenCV. Unless strictly necessary (for compatibility issues etc.), I recommend using the C++ interface of OpenCV simply because it is more convenient (from my personal experience at least). Now let me state upfront that I don't intend this statement to start a flame war on the merits of C vs C++.

Hope this helps.

Community
  • 1
  • 1
lightalchemist
  • 10,031
  • 4
  • 47
  • 55