2D-Array von OpenCV in Matplotlib.pyplot.imshow () anzeigen

8

Ich habe ein Setup in Python, wo ich die OpenCV-Bibliothek verwende, um die Frames eines Videos als 2D-Arrays zu lesen - diese Videos sind Graustufen, also verwende ich vorzeichenlose 8-Bit-Integer für die Pixelwerte.

In meinem nächsten Schritt versuche ich pyplot.imshow() von matplotlib zu verwenden, um den Frame des Videos anzuzeigen. Leider bekomme ich etwas, das überhaupt keinen Sinn ergibt.

Hier ist der Code zum Lesen des Videos:

%Vor%

cv2numpy ist eine Hilfsfunktion, die das OpenCV-Array in ein numpliges Array konvertiert (nur ein Aufruf von fromstring und dann von reshape ). Hier ist der Code, mit dem ich den ersten Frame des Videos plotte:

%Vor%

In einem anderen Code habe ich die OpenCV SaveImage in einem einzelnen Frame verwendet, um eine Referenz für das zu liefern, was ich von imshow erwarten würde. Hier ist das Bild, das ich von der ehemaligen erhalten habe, und Hier ist das Bild, das ich aus dem obigen Code erhalte .

Wie Sie sehen können, sind sie sehr unterschiedlich. Das einzige, was ich aus dem tatsächlichen Bild herauslesen kann, ist das Striping: Es sieht fast so aus, als würde es die Dimensionen falsch bekommen, es sind mehr Pixel in der Breite als in der Höhe (dieses Bild soll 128 x 256 sein). Aber ich habe versucht, das Array vor dem Zeichnen zu transponieren, indem ich die Parameter extent und aspect und shape entsprechend der Imshow-Dokumentation , und mit Ausnahme von einigen bizarren Pixel-Stretching habe ich keine Lösung gefunden.

Irgendwelche Gedanken?

BEARBEITEN 1: Ich denke, es wäre ratsam, den cv2numpy -Code hinzuzufügen, falls das Umformen die Dinge irgendwie verwirren sollte (da mein "Wahrheitsbild" oben diesen Code nicht verwendet und daher auch nicht cv2numpy ist nur in der fraglichen Pipeline involviert.)

%Vor%     
Magsol 23.01.2012, 19:01
quelle

2 Antworten

5

Ich glaube, dass das Problem mit Ihrer cv2numpy-Funktion ist. Versuchen Sie Folgendes:

%Vor%

Es hat den Trick für mich getan. Wenn Sie keine Graustufeneingabe verwenden (ich weiß, dass Sie angegeben haben, dass Sie jetzt Graustufen verwenden), müssen Sie mit cv.CreateImage und cv.CvtColor konvertieren.

    
Justin Peel 24.01.2012, 03:49
quelle
1

Verwenden Sie Version 2.3.1? Mit der cv2 API müssen wir unsere eigene Version der OpenCV / Numpy-Konvertierung nicht mehr implementieren. Zum Beispiel funktioniert der folgende Code genau richtig:

%Vor%     
TH. 25.01.2012 12:50
quelle