Risposte:
cv2
utilizza numpy
per manipolare le immagini, quindi il modo migliore e corretto per ottenere le dimensioni di un'immagine è usare numpy.shape
. Supponendo che tu stia lavorando con immagini BGR, ecco un esempio:
>>> import numpy as np
>>> import cv2
>>> img = cv2.imread('foo.jpg')
>>> height, width, channels = img.shape
>>> print height, width, channels
600 800 3
Nel caso in cui stavi lavorando con immagini binarie, img
avrà due dimensioni, quindi devi cambiare il codice in:height, width = img.shape
h, w = img.shape[:2]
, soprattutto perché l'OP non è interessato alla profondità. (Nemmeno io). Vedi la mia risposta per maggiori dettagli.
Temo che non ci sia un modo "migliore" per ottenere queste dimensioni, tuttavia non è molto doloroso.
Ovviamente il tuo codice dovrebbe essere sicuro sia per le immagini binarie / mono che per quelle multicanale, ma le dimensioni principali dell'immagine vengono sempre prima nella forma dell'array numpy. Se opti per la leggibilità o non vuoi preoccuparti di digitarlo, puoi racchiuderlo in una funzione e dargli un nome che ti piace, ad esempio cv_size
:
import numpy as np
import cv2
# ...
def cv_size(img):
return tuple(img.shape[1::-1])
Se sei su un terminale / ipython, puoi anche esprimerlo con un lambda:
>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)
Scrivere funzioni con def
non è divertente mentre si lavora in modo interattivo.
modificare
Inizialmente pensavo che l'uso [:2]
fosse OK, ma la forma numpy lo è (height, width[, depth])
, e abbiamo bisogno (width, height)
, come ad esempio si cv2.resize
aspetta, quindi - dobbiamo usare [1::-1]
. Ancora meno memorabile di [:2]
. E chi ricorda comunque il reverse slicing?
img.shape[:2][::-1]
numpy.shape
non è richiamabile. È solo una pianuratuple
. Sfortunatamente, può essere lungo 3 o 2 elementi.