Hough circles in OpenCV

OpenCV comes along with an already made function that detects circles using the hough transform. The Circle Hough Transform is a little inefficient at detecting circles, so it uses the gradient method of detecting circles using the hough transform. Anyway, you don’t need to know the details about the internals if you just want to get the command to work.

The command

The command has the following syntax:

CvSeq* cvHoughCircles(CvArr* image, void* circle_storage, int method, double dp, double min_dist, double param1=100, double param2=100, int min_radius=0, int max_radius=0);

The parameters are similar to that of cvHoughLines2 (Hough transform for lines in OpenCV). I’ll go through each parameter in detail:

image is the 8-bit single channel image you want to search for circles in. Because this function uses the gradient method, it automaticall calls cvSobel internally. So, even if you pass a grayscale image, it will automatically generate a binary using cvSobel (internally).

circle_storage is where the function puts its results. You can pass a matrix or a CvMemoryStorage structure here.

method is always CV_HOUGH_GRADIENT

dp lets you set the resolution of the accumulator. dp is a kind of scaling down factor. The greater its value, the lower the resolution of the accumulator. dp must always be more than or equal to 1.

min_dist is the minimum distance between circle to be considered different circles.

param1 is used for the (internally called) canny edge detector. The first parameter of the canny is set to param1, and the second is set to param1/2.

param2 sets the minimum number of “votes” that an accumulator cell needs to qualify as a possible circle.

min_radius and max_radius do exactly what to mean. They set the minimum and maximum radii the function searches for.

Extracting results

To get results, you need to supply a circle_storage. It can be either a matrix of a CvMemoryStorage structure.

CvMat matrix

This is straightforward. You give it a matrix with N rows and 1 column, and in CV_32FC3 format. It’s three channeled to hold the three parameters (x, y and r). In this case, the function returns a NULL.

CvMemoryStorage memory storage

Here you supply a CvMemoryStorage structure, and the function returns a CvSeq sequence. You can extract data from thsi sequence like this:

float* circle = (float*) cvGetSeqElem(circles , index);

Then, circle[0] is the x coordinate, circle[1] is the y coordinate and circle[2] is the radius of the circle.

Done!

This should be enough to get you started with using this function and identifying circles in your images!

Issues? Suggestions? Visit the Github issue tracker for AI Shack

Back to top

4 Comments

  1. KaiL
    Posted March 30, 2011 at 1:27 pm | Permalink

    Hihi Thanks for your help. Now I am able to detect CIrcles in real time but it is a bit not accurate as it detect my neck as a circle. It also detect some parts of the surrender area as circle , other than that , everything is ok if I put a circle object over to my webcam. Do you have any idea how I can make it more accurate and also are there any method to detect other shapes like square , rectangle and more?

  2. rbni2
    Posted January 21, 2012 at 11:40 pm | Permalink

    what will i do if i want to track real time motion of a tennis ball?would u please help me in this?please give me the source code if u have one.

    • Posted January 22, 2012 at 2:18 am | Permalink

      I guess you’d do something similar to this.

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

You may use these HTML tags and attributes <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>