2013-09-30 10 views
42

Come ottenere la dimensione dell'immagine nel wrapper cv2 in Python OpenCV (numpy). C'è un modo corretto per farlo rispetto a numpy.shape(). Come ottenerlo nelle dimensioni del formato: (larghezza, altezza) elenco?Il wrapper Python opencv2 (cv2) ottiene le dimensioni dell'immagine?

Grazie

+1

'numpy.shape' non è richiamabile. È solo una semplice "tupla". Sfortunatamente, può essere lungo 3 o 2 elementi. –

risposta

98

cv2 utilizza numpy per manipolare le immagini, quindi il modo corretto e migliore per ottenere la dimensione di un'immagine sta usando numpy.shape. Supponendo che si lavora con immagini BGR, qui è 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 steste lavorando con immagini binarie, img avrà due dimensioni, e quindi è necessario modificare il codice: height, width = img.shape

+6

Oh, andiamo. Invece di assumere che l'immagine sarà BGR o mono, basta scrivere in generale - 'h, w = img.shape [: 2]', soprattutto perché l'OP non è interessato alla profondità. (Neanche io ero). Vedi la mia risposta per maggiori dettagli. –

+1

Ho trovato questo utile: http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html#accessing-image-properties – djwbrown

10

I temo che non ci sia un modo "migliore" per ottenere questa taglia, tuttavia non è tanto dolore.

Ovviamente il codice deve essere sicuro sia per le immagini binarie/mono che per quelle multicanale, ma le dimensioni principali dell'immagine vengono sempre prima nella forma della serie numpy. Se si opta per la leggibilità o non si vuole preoccuparsi di digitare questo, è possibile includerlo in una funzione e assegnargli un nome che si desidera, ad es. cv_size:

import numpy as np 
import cv2 

# ... 

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

Se siete su un terminale/ipython, è anche possibile esprimere con un lambda:

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

funzioni di scrittura con def non è divertente mentre si lavora in modo interattivo.

Modifica

Originariamente ho pensato che l'utilizzo di [:2] era OK, ma la forma è NumPy (height, width[, depth]), e abbiamo bisogno (width, height), come ad esempio cv2.resize si aspetta, quindi, dobbiamo usare [1::-1]. Ancora meno memorabile di [:2]. E chi ricorda comunque l'affettamento inverso?

+1

Forse non terribilmente utile, ma potresti anche dividerlo come 'img.shape [: 2] [:: - 1]' – billyjmc

+1

Non c'è motivo per cui devi essere innamorato dei due punti nelle parentesi indice. return (image.shape [1], image.shape [0]) è sia succinto che leggibile. – mcduffee

Problemi correlati