J'ai écrit un code Python de base pour créer une image et ensuite mettre un rectangle sur les limites. Cela ne semble pas fonctionner. J'ai vérifié plusieurs sites et c'est le code exact qu'ils utilisent. Je ne sais pas quel est le problème.
TypeError <ipython-input-251-4b78f75077e8> in <module>() 4 img = Image.new('RGB', (800, 900), color= (171, 183, 255)) 5 # cv2.rectangle(img, 0, 0, 800, 900, (255,0,0)) ----> 6 cv2.rectangle(img,(1,1),(800,900),(255,0,0),15) 7 img TypeError: an integer is required (got type tuple)
Je reçois cette erreur
import cv2 import numpy as np img = Image.new('RGB', (800, 900), color= (171, 183, 255)) cv2.rectangle(img,(1,1),(800,900),(255,0,0),15) img
Quelqu'un peut-il m'aider?
3 Réponses :
J'ai trouvé la solution. Merci @Martijn Pieters
import cv2 import numpy as np from PIL import Image img = Image.new('RGB', (800, 900), color= (171, 183, 255)) open_cv_image = np.array(img) cv2.rectangle(open_cv_image,(0,0),(800,900),(0,0,0),30) img2 = Image.fromarray(open_cv_image, 'RGB')
Le module cv2
fonctionne avec des tableaux numpy en tant qu'images, pas avec des instances PIL
Image
.
Comme l'implémentation cv2.rectangle
et le type Image
sont entièrement implémentés dans du code compilé, le suivi n'est pas du tout utile pour comprendre ce qui ne va pas. Sous le capot, le code natif cv2.rectangle ()
tente d'accéder à quelque chose sur l'objet image qui nécessitait un entier mais cv2.rectangle ()
passé dans un tuple à la place, car il s'attendait à interagir avec un tableau numpy.
Si tout ce que vous vouliez était une image vierge avec une couleur RVB uniforme, créez un tableau numpy avec la forme (largeur, hauteur, 3) et votre ensemble de 3 bandes à votre valeur RVB préférée:
# create numpy array from PIL image nparray = np.array(img) # create PIL image from numpy array img = Image.fromarray(nparray)
puis appliquez votre appel cv2.rectangle ()
à ce tableau.
Vous pouvez toujours convertir depuis et vers une image PIL avec:
import numpy as np # numpy equivalent of Image.new('RGB', (800, 900), color=(171, 183, 255)) img = np.zeros((800, 900, 3), np.uint8) img[..., :] = (171, 183, 255)
Dans certains cas, OpenCV aura besoin d'une image d'encapsulation avec la classe UMat.
img = Image.new('RGB', (800, 900), color= (171, 183, 255)) open_cv_image = np.array(img) image = cv2.UMat(open_cv_image).get() cv2.rectangle(open_cv_image,(0,0),(800,900),(0,0,0),30)
aussi, quel type d'objet est
Image
? Est-ce que c'est le moduleImage
de PIL / Pillow, par exempledepuis l'image d'importation PIL
?Oui, le module d'image provient de Pillow.
Ensuite, convertissez cette image en un tableau numpy , OpenCV n'apparaît pas pour travailler directement avec des images PIL.