J'essaye de passer un ndarray dans cette ligne: cv2.fillPoly(im, pts=[cnt],color=(centroid_color[0],centroid_color[1],centroid_color[2]))
centroid_color ressemble à ceci: [ 0 255 0]
et est de type<type 'numpy.ndarray'>
Cependant, je continue à recevoir cette erreur: TypeError: La valeur scalaire de l'argument «couleur» n'est pas numérique.
Comment puis-je convertir cela correctement?
edit: mon code mis à jour actuel qui obtient toujours la même erreur:
im = cv2.imread('luffy.jpg')
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,0)
contours,h = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
moment = cv2.moments(cnt)
c_y = moment['m10']/(moment['m00']+0.01)
c_x = moment['m01']/(moment['m00']+0.01)
centroid_color = im[c_x,c_y]
centroid_color = np.array((centroid_color[0],centroid_color[1],centroid_color[2]))
r = lambda: random.randint(0,255)
print type(centroid_color)
cv2.fillPoly(im,cnt,centroid_color)
Vous pouvez passer un tableau numpy directement comme argument de couleur comme ceci:
import numpy as np
import cv2
pts = np.array([[[10,40], [70,16], [100,90] ]], np.int32)
im = np.zeros([240,320, 3], np.uint8)
color = np.array((60,0,255))
cv2.fillPoly( im, pts, color)
cv2.imshow(" ", im)
cv2.waitKey(1)
Bien sûr, il est également possible (bien que inutile) de l'écrire comme ceci:
clr = np.array([255, 0, 128])
cv2.fillPoly( im, pts, color=(clr[0], clr[1], clr[2]))
Edit: Opencv nécessite que l'argument color soit un tableau de type float ou integer. Le type que vous obtenez d'une image RVB à 3 canaux est probablement uint8. Essayez d'ajouter
centroid_color = centroid_color.astype(np.int32, copy=False)
avant de passer l'argument de couleur à cv2.fillPoly!
Le message d'erreur opencv est un peu déroutant ici ...
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots