Given the hsv-color (hc)of the sphere in the camera-image. We can now try to track the sphere within the video feed.
Here is what i do:
- convert the color frame to HSV
- filter the HSV frame with cvInRange(src,min,max,mask)
- min = cvScalar(hc - 5, hc - 85, hc.val - 35, 0);
- max = cvScalar(hc + 5, hc + 85, hc.val + 35, 0);
- As you can see, the hue-value is only in a very limited range (+-5), whilst the saturation my vary quite largely (+-85) and the intensity moderately (+-35). Giving saturation so much space to vary, gives better robustness for fast movements.
- remove small noise from the image with a median filter, cvSmooth(CV_MEDIAN, 5, 5)
- find all blobs within the binary image with cvFindContours
- iterate all found contours and remember only the biggest one
- calculate the center of mass from that biggest contour to approximate the center of the sphere
- cvMoments(mask, &mu, 0);
- cvPoint(mu.m10 / mu.m00, mu.m01 / mu.m00);
The tracking (just the calculation steps above) run on my computer (Win7, Intel E5200) @ around 70fps. And seems to be quite robust. However, as you can see at the end in the first video, calculating the center of mass may be fast, but it is error-pronte to occlusions!
- demo application --> https://github.com/benniven/psmoveapiplayground/zipball/ex1
- psmove-api headers --> https://github.com/benniven/psmoveapi
- psmove-api library build
- CL-Driver for the PS-Eye
- Windows operating system
- OpenCV 2.4 headers --> http://opencv.willowgarage.com/wiki/
- OpenCV 2.4 library build --> OpenCV 2.4 win binary