cv2
Python OpenCV'de (numpy) sarmalayıcıdaki bir görüntünün boyutu nasıl elde edilir . Bunu yapmanın dışında doğru bir yolu var mı numpy.shape()
? Bu format boyutlarında nasıl elde edebilirim: (genişlik, yükseklik) listesi?
Yanıtlar:
cv2
numpy
görüntüleri işlemek için kullanır , bu nedenle bir görüntünün boyutunu elde etmenin doğru ve en iyi yolu kullanmaktır numpy.shape
. BGR görüntüleri ile çalıştığınızı varsayarsak, işte bir örnek:
>>> import numpy as np
>>> import cv2
>>> img = cv2.imread('foo.jpg')
>>> height, width, channels = img.shape
>>> print height, width, channels
600 800 3
İkili görüntülerle çalışmanız img
durumunda, iki boyuta sahip olacaksınız ve bu nedenle kodu şu şekilde değiştirmeniz gerekir:height, width = img.shape
h, w = img.shape[:2]
özellikle de OP derinlikle ilgilenmediğinden. (Ben de değildim). Daha fazla ayrıntı için cevabıma bakın.
Korkarım bu boyutu elde etmenin "daha iyi" bir yolu yok, ancak o kadar da acı verici değil.
Elbette kodunuz hem ikili / mono görüntüler hem de çok kanallı görüntüler için güvenli olmalıdır, ancak görüntünün temel boyutları her zaman numpy dizisinin biçiminde ilk sırada gelir. Okunabilirliği seçerseniz veya bunu yazmakla uğraşmak istemezseniz, onu bir işleve ekleyebilir ve istediğiniz bir ad verebilirsiniz, örneğin cv_size
:
import numpy as np
import cv2
# ...
def cv_size(img):
return tuple(img.shape[1::-1])
Bir terminal / ipython üzerindeyseniz, bunu bir lambda ile de ifade edebilirsiniz:
>>> cv_size = lambda img: tuple(img.shape[1::-1])
>>> cv_size(img)
(640, 480)
def
Etkileşimli olarak çalışırken fonksiyonları yazmak eğlenceli değildir.
Düzenle
Başlangıçta kullanmanın iyi olduğunu düşünmüştüm [:2]
, ama uyuşuk şekil (height, width[, depth])
ve (width, height)
örneğin cv2.resize
beklediği gibi ihtiyacımız var - kullanmalıyız [1::-1]
. Daha az akılda kalıcı [:2]
. Ve kim ters dilimlemeyi hatırlıyor ki?
img.shape[:2][::-1]
numpy.shape
çağrılabilir değil. Bu sadece düztuple
. Ne yazık ki, 3 veya 2 element uzunluğunda olabilir.