2017-02-19 5 views
1

Ich habe Probleme, ein Rechteck auf einem Bild mit OpenCV zu zeichnen und dann das Bild mit Matplotlib anzuzeigen. Dieser Code in einem Jupyter Notebook Ergebnissen in einem schwarzen Bild angezeigt wird, ohne grünes Rechteck:plt.imshow() zeigt keine numpy Matrix korrekt an

import numpy as np 
import cv2 
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 

%matplotlib inline 
image = np.zeros((720, 1280, 3)) 
cv2.rectangle(image, (100,100), (200,200), color=(0,255,0), thickness=2) # Green 
plt.imshow(image) 

Ich glaube, ich das Rechteck sehen kann, wenn ich das Bild mit cv2.imshow() anzuzeigen, aber ich weiß nicht, dass OpenCV Bilder Inline können in Jupyter Notebooks wie Matplotlib Bilder angezeigt werden.

EDIT: Ich denke, was wirklich los ist aus the documentation in diesem Auszug erklärt:

Der Wert für jede Komponente der MxNx3 und MxNx4 float Arrays im Bereich 0,0 bis 1,0 liegt.

Es kann Werte zwischen 0 und 255 verarbeiten, wenn es sich um ein Integer-Array handelt.

Antwort

4

standardmäßig, wenn Sie eine numpy Array erstellen mit np.zeros() oder np.ones(), der Standarddatentyp der Matrix gesetzt Schwimmer sein, oder genauer gesagt np.float64, und es scheint ein Problem in matplotlib zu sein, um eine Matrix mit Schwimmer zu machen Datentyp (Stand Konvention die RGB-Werte in einem Bild immer integriert sind, so können wir nicht matplotlib dafür verantwortlich machen.)

Jetzt haben Sie 2 Möglichkeiten:

  • erstellen Sie die numpy Matrix mit np.uint8 Datentyp

    image = np.zeros((720, 1280, 3), dtype = np.uint8) 
    
  • Konvertieren Sie die Matrix im Integraltyp, bevor Sie sie auf plt rendern.

    image = np.astype(image, np.uint8) 
    

Darüber hinaus müssen Sie plt.show() am Ende hinzuzufügen.

+1

Danke. Übrigens unterlasse ich 'plt.show()', weil ich in einem Jupyter Notebook bin und das Bild erscheint, ohne diese Funktion aufzurufen. Außerhalb eines Jupyter Notebooks benötige ich diesen Funktionsaufruf. – royco

+0

Oh, dann ist es in Ordnung :) – ZdaR