Search code examples
image-processinggesturegesture-recognitiongestures

Circle estimation from 2D data set


I am doing some computer vision based hand gesture recognising stuff. Here, I want to detect a circle (a circular motion) made by my hand. My initial stages are working fine and I am able to get a blob whose centroid from each frame I am plotting. This is essentially my data set. A collection of 2D co-ordinate points. Now I want to detect a circular type motion and say generate a call to a function which says "Circle Detected". The circle detector will give a YES / NO boolean output. Here is a sample of the data set I am generating in 40 framesThe x, y values are just plotted to a bitmap image using MATLAB

The x, y values are just plotted to a bitmap image using MATLAB. My initial hand movement was slow and later I picked up speed to complete the circle within stipulated time (40 frames). There is no hard and fast rule about the number of frames thing but for now I am using a 40 frame sliding window for circle detection (0-39) then (1-40) then (2-41) etc. I am also calculating the arc-tangent between successive points using:

angle = atan2(prev_y - y, prev_x - x) * 180 / pi;

Now what approach should I take for detecting a circle (This sample image should result in a YES). The angle as I am noticing is not steadily increasing from 0 to 360. It does increase but with jumps here and there.


Solution

  • If you are only interested in full or nearly full circles:

    I think that the standard parameter estimation approach: Hough/RANSAC won't work very well in this case.

    Since you have frames order and therefore distances between consecutive blob centers, you can create a nearly uniform sub sample of the data (let say, pick 20 points spaced ~evenly), calculate the center and measure the distance of all points from that center.

    If it is nearly a circle all points will have similar distance from the center.

    If you want to do something slightly more robust, you can:

    • Compute center (mean) of all points.
    • Perform gradient descent to update the center: should be fairly easy an you won't have local minima. The error term I would probably use is max(D) - min(D) where D is the vector of distances between the blob centers and estimated circle center (but you can use robust statistics instead of max & min)
    • Evaluate the circle