Otoka Pythona OpenCV2 (cv2), aby uzyskać rozmiar obrazu?
98
Jak uzyskać rozmiar obrazu w cv2opakowaniu 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?
numpy.shapenie jest wywoływalne. To po prostu zwykłe tuple. Niestety może mieć długość 3 lub 2 elementy.
Tomasz Gandor
Odpowiedzi:
211
cv2używa numpydo 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:
Och przestań. Zamiast zakładać, że obraz będzie BGR lub mono, pisz ogólnie - 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 npimport 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:
Pisanie funkcji w programie defnie 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.resizespodziewa, więc - musimy użyć [1::-1]. Jeszcze mniej niezapomniany niż [:2]. A kto tak czy owak pamięta o odwrotnym krojeniu?
numpy.shape
nie jest wywoływalne. To po prostu zwykłetuple
. Niestety może mieć długość 3 lub 2 elementy.Odpowiedzi:
cv2
używanumpy
do manipulowania obrazami, więc właściwym i najlepszym sposobem uzyskania rozmiaru obrazu jest użycienumpy.shape
. Zakładając, że pracujesz z obrazami BGR, oto przykład:Jeśli pracujesz z obrazami binarnymi,
img
będzie miał dwa wymiary, dlatego musisz zmienić kod na:height, width = img.shape
źródło
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
:Jeśli jesteś na terminalu / ipythonie, możesz to również wyrazić za pomocą lambda:
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?źródło
img.shape[:2][::-1]