web-dev-qa-db-fra.com

Python wrapper opencv2 (cv2) obtenir la taille de l'image?

Comment obtenir la taille de l'image dans cv2 wrapper dans Python OpenCV (numpy). Existe-t-il une façon correcte de faire cela, numpy.shape(). Comment l'obtenir dans le format dimensions: (largeur, hauteur) liste?

Merci

80
xercool

cv2 utilise numpy pour manipuler des images. Le meilleur moyen d'obtenir la taille d'une image consiste donc à utiliser numpy.shape. En supposant que vous travaillez avec des images BGR, voici un exemple:

>>> import numpy as np
>>> import cv2
>>> img = cv2.imread('foo.jpg')
>>> height, width, channels = img.shape
>>> print height, width, channels
  600 800 3

Si vous travaillez avec des images binaires, img aura deux dimensions et vous devez donc changer le code en: height, width = img.shape

167
jabaldonedo

Je crains qu'il n'y ait pas de "meilleur" moyen d'obtenir cette taille, mais ce n'est pas si douloureux.

Bien entendu, votre code doit être sûr pour les images binaires/mono et les images multicanaux, mais les dimensions principales de l’image arrivent toujours en premier dans la forme du tableau numpy. Si vous optez pour la lisibilité ou si vous ne voulez pas vous soucier de la saisir, vous pouvez l'envelopper dans une fonction et lui attribuer un nom, par exemple. cv_size:

import numpy as np
import cv2

# ...

def cv_size(img):
    return Tuple(img.shape[1::-1])

Si vous êtes sur un terminal/ipython, vous pouvez aussi l'exprimer avec un lambda:

>>> cv_size = lambda img: Tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)

Écrire des fonctions avec def n'est pas amusant en travaillant de manière interactive.

Éditer

À l’origine, j’imaginais que l’utilisation de [:2] était acceptable, mais la forme numpy est (height, width[, depth]) et nous avons besoin de (width, height), comme par exemple. cv2.resize attend, donc - nous devons utiliser [1::-1]. Encore moins mémorable que [:2]. Et qui se souvient de toute façon du tranchage inversé?

18
Tomasz Gandor