ZeroDivisionError (Python)

Recibo un error de división cero con algunas imágenes (aunque muchas de ellas funcionan bien):

Aquí está el código:

image = skimage.io.imread('test.png', False) image_gray = skimage.io.imread('test.png', True) blurred = cv2.GaussianBlur(img_as_ubyte(image_gray), (5, 5), 0) thresh = threshold_li(blurred) binary = blurred > thresh binary_cv2 = img_as_ubyte(binary) # find contours in the thresholded image cnts = cv2.findContours(binary_cv2.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if imutils.is_cv2() else cnts[1] # loop over the contours for c in cnts: # compute the center of the contour M = cv2.moments(c) cX = int(M["m10"] / M["m00"]) cY = int(M["m01"] / M["m00"]) # draw the contour and center of the shape on the image cv2.drawContours(img_as_ubyte(image), [c], -1, (0, 255, 0), 2) cv2.circle(img_as_ubyte(image), (cX, cY), 7, (255, 255, 255), -1) cv2.putText(img_as_ubyte(image), "center", (cX - 20, cY - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2) viewer = ImageViewer(image) viewer.show() 

 Traceback (most recent call last): File "Center.py", line 26, in  cX = int(M["m10"] / M["m00"]) ZeroDivisionError: float division by zero 

¡Gracias por adelantado!

El error es evidente por sí mismo. No puedes dividir un número por cero. Si M["m00"] es cero, entonces necesita manejarlo adecuadamente. Compruebe si hay 0 valores en M["m00"] .

 if M["m00"] != 0: cX = int(M["m10"] / M["m00"]) cY = int(M["m01"] / M["m00"]) else: # set values as what you need in the situation cX, cY = 0, 0 

Probablemente tienes malos contornos

Nota Dado que los momentos de contorno se calculan utilizando la fórmula verde, puede obtener resultados aparentemente extraños para contornos con auto-intersecciones, por ejemplo, un área cero (m00) para contornos en forma de mariposa.

Calcule el centro de masa, por ejemplo:

 cx = 0 cy = 0 for p in contour: cx += p[0][0] cy += p[0][1] cx = int(cx/len(contour)) cy = int(cy/len(contour)) 

o mira en boundingRect () (3.4.3).

Relacionado: Encontrar el centro de un contorno usando opencv y visual c ++