2013-09-30 10 views
42

So erhalten Sie die Größe des Bildes in Wrapper in Python OpenCV (numpy). Gibt es einen richtigen Weg dies zu tun als numpy.shape(). Wie man es in Formatabmessungen bekommt: (Breite, Höhe) Liste?Python opencv2 (cv2) Wrapper Bildgröße erhalten?

Dank

+1

'numpy.shape' ist nicht aufrufbar. Es ist nur ein einfaches 'Tupel'. Leider kann es entweder 3 oder 2 Elemente lang sein. –

Antwort

98

cv2 verwendet numpy Bilder für die Manipulation, so dass die richtige und beste Weg, die Größe eines Bildes zu erhalten, ist numpy.shape verwenden. Angenommen, Sie sind mit BGR Bildern arbeiten, ist hier ein Beispiel:

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

Falls Sie mit binären Bildern arbeiteten, img werden zwei Dimensionen haben, und deshalb müssen Sie den Code ändern: height, width = img.shape

+6

Oh, komm schon. Anstatt anzunehmen, dass das Bild BGR oder Mono ist, schreibe einfach allgemein - "h, w = img.shape [: 2]", besonders, da das OP nicht an der Tiefe interessiert ist. (Ich auch nicht). Siehe meine Antwort für weitere Details. –

+1

Ich fand das hilfreich: 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 Ich fürchte, es gibt keinen "besseren" Weg, um diese Größe zu erreichen, aber es ist nicht so viel Schmerz.

Natürlich sollte Ihr Code sowohl für binäre/Monobilder als auch für mehrkanalige Bilder sicher sein, aber die Hauptabmessungen des Bildes kommen immer zuerst in der Form des numpigen Arrays. Wenn Sie sich für die Lesbarkeit entscheiden oder diese nicht eingeben möchten, können Sie sie in eine Funktion einfügen und ihr einen Namen geben, den Sie mögen, z. cv_size:

import numpy as np 
import cv2 

# ... 

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

Wenn Sie auf einem Terminal/ipython sind, können Sie mit einem Lambda-Ausdruck bringen es auch:

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

Schreibfunktionen mit def ist nicht Spaß beim interaktiv arbeiten.

bearbeiten

Ursprünglich dachte ich, dass [:2] mit war in Ordnung, aber die numpy Form ist (height, width[, depth]), und wir brauchen (width, height), wie z.B. cv2.resize erwartet, also - wir müssen [1::-1] verwenden. Noch weniger denkwürdig als [:2]. Und wer erinnert sich überhaupt an Rückwärtsschneiden?

+1

Vielleicht nicht schrecklich hilfreich, aber Sie könnten es auch als schneiden 'img.shape [: 2] [:: - 1]' – billyjmc

+1

Es gibt keinen Grund, warum du dich in Doppelpunkte in deinen Indexklammern verlieben musst. return (image.shape [1], image.shape [0]) ist sowohl prägnant als auch lesbar. – mcduffee

Verwandte Themen