2013-09-30 12 views
42

Jak uzyskać rozmiar obrazu w opakowaniu cv2 w języku Python OpenCV (numpy). Czy jest to prawidłowy sposób niż numpy.shape(). Jak zdobyć go w formacie: lista (szerokość, wysokość)?Opakowanie Python opencv2 (cv2) ma rozmiar obrazu?

Dzięki

+1

'numpy.shape' nie jest wywoływalny. To zwykła "krotka". Niestety, może mieć długość 3 lub 2 elementów. –

Odpowiedz

98

cv2 wykorzystuje numpy do manipulowania obrazy, więc właściwy i najlepszy sposób, aby uzyskać rozmiar obrazu wykorzystuje numpy.shape. Zakładając, że pracują z obrazami BGR, oto przykład:

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

W przypadku, gdy pracowali z obrazów binarnych, img będzie miała dwa wymiary, a zatem należy zmienić kod w celu: height, width = img.shape

+6

Och, daj spokój. Zamiast zakładać, że obraz będzie BGR lub mono, po prostu napisz ogólnie - 'h, w = img.shape [: 2]', zwłaszcza, że ​​OP nie jest zainteresowany głębią. (Ja również nie). Zobacz moją odpowiedź, aby uzyskać więcej informacji. –

+1

Uważam, że jest to pomocne: 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 "obawiam się, że nie ma" lepszego "sposobu na uzyskanie tego rozmiaru, ale to nie tyle ból.

Oczywiście kod powinien być bezpieczny zarówno dla obrazów binarnych/mono, jak i wielokanałowych, ale główne wymiary obrazu są zawsze pierwsze w kształcie tablicy numpy. Jeśli zdecydujesz się na czytelność lub nie chcesz, aby to wpisywać, możesz zawinąć je w funkcję i nadać mu nazwę, którą chcesz, np. cv_size:

import numpy as np 
import cv2 

# ... 

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

Jeśli jesteś na terminalu/ipython można również wyrazić za pomocą lambda:

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

funkcje pisanie def nie jest zabawa podczas pracy interaktywnie.

Edit

Początkowo myślałem, że za pomocą [:2] było OK, ale numpy kształt jest (height, width[, depth]) i musimy (width, height), jak na przykład cv2.resize oczekuje, więc - musimy użyć [1::-1]. Jeszcze mniej niezapomniany niż [:2]. I kto pamięta zresztą odwrotne cięcie?

+1

Może nie bardzo pomocna, ale możesz też podzielić ją jako 'img.shape [: 2] [:: - 1]' – billyjmc

+1

Nie ma powodu, dla którego musisz zakochać się w dwukropkach w nawiasach. return (image.shape [1], image.shape [0]) jest zarówno zwięzły, jak i czytelny. – mcduffee

Powiązane problemy