Comment obtenir la taille d'une image dans l'enveloppe cv2
en Python OpenCV (numpy). Y a-t-il une méthode correcte pour le faire autre que numpy.shape()
. Comment puis-je l'obtenir dans ces dimensions de format : liste (largeur, hauteur) ?
Réponses
Trop de publicités?cv2
utilise numpy
pour manipuler les images, donc la meilleure façon d'obtenir la taille d'une image est d'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 par conséquent vous devez changer le code en : height, width = img.shape
Je crains qu'il n'y ait pas de moyen "meilleur" d'obtenir cette taille, mais ce n'est pas si douloureux.
Bien sûr, votre code doit être sûr à la fois pour les images binaires/monochromes et pour celles à plusieurs canaux, mais les dimensions principales de l'image viennent toujours en premier dans la forme du tableau numpy. Si vous optez pour la lisibilité, ou si vous ne voulez pas vous embêter à taper ceci, vous pouvez l'encapsuler dans une fonction et lui donner un nom qui vous convient, 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 également l'exprimer avec une fonction lambda :
>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)
Écrire des fonctions avec def
n'est pas amusant lorsqu'on travaille de manière interactive.
Modifier
À l'origine, je pensais que l'utilisation de [:2]
était correcte, mais la forme numpy est (hauteur, largeur[, profonfeur])
, et nous avons besoin de (largeur, hauteur)
, comme par exemple cv2.resize
l'attend, donc - nous devons utiliser [1::-1]
. Encore moins mémorable que [:2]
. Et qui se souvient de découper en tranches inversées de toute façon ?
Dépaquetage de tuples en Python 3
Après que nous soyons tous passés à Python 3, et donc avons ceci https://peps.python.org/pep-3132/ -- nous pouvons également obtenir h
et w
en utilisant le dépaquetage de tuples :
h, w, *_ = img.shape
Cette fois, nous n'avons plus à nous soucier des images à un seul canal :)
import cv2
import numpy as np
def main():
# init cv
cap = cv2.VideoCapture(0)
while True:
success, img = cap.read()
# WAY 1
img = cv2.flip(img, 1)
print(img.shape)
# WAY 2
print(
f"largeur : {cap.get(cv2.CAP_PROP_FRAME_WIDTH)}, hauteur : {cap.get(cv2.CAP_PROP_FRAME_HEIGHT)}, fps : {cap.get(cv2.CAP_PROP_FPS)}")
cv2.imshow(winname="contrôle universel", mat=img)
cv2.waitKey(1)
if __name__ == '__main__':
main()