2
votes

Obtention d'une erreur "integer is required (got type tuple)", dessin d'un rectangle à l'aide de cv2

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 commentaires

aussi, quel type d'objet est Image ? Est-ce que c'est le module Image de PIL / Pillow, par exemple depuis 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.


3 Réponses :


3
votes

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')


0 commentaires

4
votes

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)


0 commentaires

1
votes

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)


0 commentaires