Pandey Rashmi
Pandey Rashmi

Reputation: 157

OpenCV - Detecting circular shapes

I have some code which detects circular shapes but I am unable to understand how it works.

From this code:

  1. How can i find the radius and center point of the circle?
  2. What is the behaviour of `cv2.approxPolyDP' for detecting circles?

Now find the contours in the segmented mask

contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

Sorting the contours w.r.t contour rect X

contours.sort(key = lambda x:cv2.boundingRect(x)[0])

for contour in contours:
        approx = cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour,True), True)
        if len(approx) > 8:
            # Find the bounding rect of contour.
            contour_bounding_rect = cv2.boundingRect(contour)
            mid_point = contour_bounding_rect[0] + contour_bounding_rect[2]/2, contour_bounding_rect[1] + contour_bounding_rect[3]/2
            print mid_point[1]/single_element_height, ", ",

Upvotes: 1

Views: 6730

Answers (2)

Jeru Luke
Jeru Luke

Reputation: 21243

So I have figured out the answer to your first question: determining the center and radius of circles in the image.

Initially I am finding all the contours present in the image. Then using a for loop, I found the center and radius using cv2.minEnclosingCircle for every contour in the image. I printed them in the console screen.

contours,hierarchy = cv2.findContours(thresh,2,1)
print len(contours)
cnt = contours

for i in range (len(cnt)):
    (x,y),radius = cv2.minEnclosingCircle(cnt[i])
    center = (int(x),int(y))
    radius = int(radius)
    cv2.circle(img,center,radius,(0,255,0),2)
    print 'Circle' + str(i) + ': Center =' + str(center) + 'Radius =' + str(radius)

To answer your second question on cv2.approxPolyDP(); this function draws an approximate contour around the object in the image based on a parameter called 'epsilon'. Higher the value of 'epsilon', the contour is roughly approximated. For a lower value of epsilon, the contour grazes almost every edge of the object in the image. Visit THIS PAGE for a better understanding.

Hope this helped!! :)

Upvotes: 5

Soltius
Soltius

Reputation: 2273

Don't think approxPolyDP is the right way to go here.

If you have an image where you only have circles and you want to find center and radius, try minEnclosingCircle()

If you have an image where you have various shapes and you want to find the circles, try Hough transform (may take a long time) or fitEllipse() where you check if the bounding box it returns is square.

See documentation for both these functions

Upvotes: 3

Related Questions