Jak uzyskać rozmiar obrazu w cv2
opakowaniu w Python OpenCV (numpy). Czy jest na to inny sposób niż numpy.shape()
. Jak mogę to uzyskać w tych wymiarach formatu: (szerokość, wysokość) lista?
Odpowiedzi:
cv2
używa numpy
do manipulowania obrazami, więc właściwym i najlepszym sposobem uzyskania rozmiaru obrazu jest użycie numpy.shape
. Zakładając, że pracujesz 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
Jeśli pracujesz z obrazami binarnymi, img
będzie miał dwa wymiary, dlatego musisz zmienić kod na:height, width = img.shape
h, w = img.shape[:2]
zwłaszcza, że PO nie interesuje głębia. (Ja również nie). Zobacz moją odpowiedź, aby uzyskać więcej informacji.
Obawiam się, że nie ma „lepszego” sposobu na uzyskanie takiego rozmiaru, jednak nie jest to aż tak duży ból.
Oczywiście twój kod powinien być bezpieczny zarówno dla obrazów binarnych / mono, jak i wielokanałowych, ale główne wymiary obrazu zawsze są na pierwszym miejscu w kształcie tablicy numpy. Jeśli zdecydujesz się na czytelność lub nie chcesz zawracać sobie głowy wpisywaniem tego, możesz zawinąć ją w funkcję i nadać jej nazwę, którą lubisz, np cv_size
:
import numpy as np
import cv2
# ...
def cv_size(img):
return tuple(img.shape[1::-1])
Jeśli jesteś na terminalu / ipythonie, możesz to również wyrazić za pomocą lambda:
>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)
Pisanie funkcji w programie def
nie jest przyjemne podczas pracy interaktywnej.
Edytować
Początkowo myślałem, że używanie [:2]
jest OK, ale kształt numpy jest (height, width[, depth])
i potrzebujemy (width, height)
, jak np. Się cv2.resize
spodziewa, więc - musimy użyć [1::-1]
. Jeszcze mniej niezapomniany niż [:2]
. A kto tak czy owak pamięta o odwrotnym krojeniu?
img.shape[:2][::-1]
numpy.shape
nie jest wywoływalne. To po prostu zwykłetuple
. Niestety może mieć długość 3 lub 2 elementy.