I'm using Python and OpenCV to detect contours in my image. But when I run the following code to draw only a specific contour using the contour index, since the indices allocated are random, I get the wrong output.
So I found out the Centroids (in my case all the centroids lie in the same horizontal line). Is there any way I can sort the contour indices from left to right (starting from 0 to n) based on the x value of the centroid?
Could you please show the code for the same? Any help would be greatly appreciated!
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
i = 9 ## Contour Index <----
cv2.drawContours(img,contours[i:i+1],-1,(0,0,255),2)
centroids = []
for cnt in contours:
mom = cv2.moments(cnt)
(x,y) = int(mom['m10']/mom['m00']), int(mom['m01']/mom['m00'])
cv2.circle(org,(x,y),4,(255,255,255),-1)
centroids.append((x,y)
Implements de sort function of list in python like here.
In the implemented function you calculate the center and verify if the X position is gretter or smaller them the other. If gretter return 1, smaller -1 and equals 0.
def greater(a, b):
momA = cv2.moments(a)
(xa,ya) = int(momA['m10']/momA['m00']), int(momA['m01']/momA['m00'])
momB = cv2.moments(b)
(xb,yb) = int(momB['m10']/momB['m00']), int(momB['m01']/momB['m00'])
if xa > xb:
return 1
if xa == xb:
return 0
else
return -1
For sure you can do better if you calculate the centers only once.
then just do
contours.sort(greater)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With