Olivier_s_j
Olivier_s_j

Reputation: 5182

Trying to get the centre of a circle with opencv

I'm trying to detect the center of a circle. I try to do this with cvHoughCircle. But I can't seem to get it working properly .

enter image description here

The only thing that can vary is the size of the circle.

I try detecting the circle by doing :

circle = cvHoughCircles(imgThreshold, storage, CV_HOUGH_GRADIENT, 1,
(double)imgThreshold.height()/20, 200, 20, 0, 0);

imgThreshold is the b/w image you can see here. The resolution of the image is in fact 1280*1024.

Can anyone tell me what I am doing wrong.

Upvotes: 1

Views: 4195

Answers (4)

Olivier_s_j
Olivier_s_j

Reputation: 5182

Instead of using cvHoughCircle it is possible to solve this problem with a bit of math:

        CvMoments moments = new CvMoments();

        cvMoments(imgThreshold, moments, 1);

        double moment10 = cvGetSpatialMoment(moments, 1, 0);
        double moment01 = cvGetSpatialMoment(moments,0,1);
        double area = cvGetCentralMoment(moments, 0, 0);

         int posX = 0;
         int posY = 0;

        int lastX = posX;
        int lastY = posY;

        posX = (int) (moment10/area);
        posY = (int) (moment01/area);

        cvCircle(iplRgbImage, new CvPoint(posX,posY), 3, CvScalar.GREEN, -1, 8, 0);

source = http://aishack.in/tutorials/tracking-colored-objects-in-opencv/

Upvotes: 3

just.steve
just.steve

Reputation: 1

Concerning Hough transform it can detect circles by identifying pixels that belongs to a circle periphery. More precisely given a binary (thresholded) image containing ie white pixels along a cyclic path, the hough circle transform will detect the circle. So the image to feed the algorithm should be binary and thresholded but in your example must be the thresholded example of an edge filter (ex Sobel) rather than a solid filled circle.

I can not tell a right way of "fitting" a circle on the above image, but the centroid of the blob extracted with connected components is a good and fast way to go.

Upvotes: 0

plan9assembler
plan9assembler

Reputation: 2984

use cvBlob

https://code.google.com/p/cvblob/

Upvotes: 1

Rethunk
Rethunk

Reputation: 4103

If the circle is complete and filled and not occluded by other shapes, you can use findContours() and then find the center of the contour.

Upvotes: 2

Related Questions