Clasificación de contornos de izquierda a derecha en Python (OpenCV)

Estoy usando Python y OpenCV para detectar contornos en mi imagen. Pero cuando ejecuto el siguiente código para dibujar solo un contorno específico usando el índice de contorno, ya que los índices asignados son aleatorios, obtengo una salida incorrecta.

Así que descubrí los centroides (en mi caso, todos los centroides se encuentran en la misma línea horizontal). ¿Hay alguna manera de ordenar los índices de contorno de izquierda a derecha (comenzando de 0 a n) en función del valor x del centroide?

¿Podría por favor mostrar el código para el mismo? Cualquier ayuda sería muy apreciada!

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) 

Implementa la función de clasificación de lista en python como aquí .

En la función implementada, usted calcula el centro y verifica si la posición X es mayor o menor que la otra. Si gretter devuelve 1, menor -1 y es igual a 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 

Seguro que puede hacerlo mejor si calcula los centros una sola vez.

entonces solo haz

 contours.sort(greater)