Der Befehl cv2.imshow funktioniert in opencv-python nicht richtig


111

Ich verwende opencv 2.4.2, Python 2.7. Der folgende einfache Code hat ein Fenster mit dem richtigen Namen erstellt, dessen Inhalt jedoch nur leer ist und das Bild nicht anzeigt:

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('ImageWindow',img)

Kennt jemand dieses Problem?


Ihr Dateipfad ist möglicherweise falsch. Windows verwendet \ not /. Ich bin nicht sicher, ob OpenCV / unter Windows toleriert. Wenn das Beheben nicht hilft, stellen Sie sicher, dass sich Ihr Bild am richtigen Ort befindet und ein gültiges Bild ist.
FMW42

Es gibt ein Tutorial mit den Grundlagen des Lesens / Anzeigens von Bildern in docs.opencv.org/master/dc/d2e/tutorial_py_image_display.html
kon

Antworten:


227

imshow()funktioniert nur mit waitKey():

import cv2
img = cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('ImageWindow', img)
cv2.waitKey()

(Die gesamte Nachrichtenschleife, die zum Aktualisieren des Fensters erforderlich ist, ist dort versteckt.)


3
check print imgdruckt ein korrektes numpy-Array, kein NoneTypeObjekt.
Abid Rahman K

7
Um der Nachwelt klar zu sein, wäre dies unter normalen Umständen die richtige Antwort. Das Weglassen des waitKey führt (normalerweise) zu genau dem in der Frage beschriebenen Verhalten.
Snesticle

45

Die Antwort, die für mich funktioniert hat, habe ich hier gefunden: http://txt.arboreus.com/2012/07/11/highgui-opencv-window-from-ipython.html

Wenn Sie eine interaktive Ipython-Sitzung ausführen und Highgui-Fenster verwenden möchten, führen Sie zuerst cv2.startWindowThread () aus.

Im Detail: HighGUI ist eine vereinfachte Oberfläche zum Anzeigen von Bildern und Videos aus OpenCV-Code. Es sollte so einfach sein wie:

import cv2
img = cv2.imread("image.jpg")
cv2.startWindowThread()
cv2.namedWindow("preview")
cv2.imshow("preview", img)

7
Sie können es anschließend von cv2.destroyAllWindows ()
Zuza

Für die QT-Implementierung von highgui führt startWindowThread () nichts aus. github.com/opencv/opencv/blob/…
kusi

24

Sie müssen cv2.waitKey(0)nach verwenden cv2.imshow("window",img). Nur dann wird es funktionieren.

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('Window',img)
cv2.waitKey(0)

Ich würde hinzufügen, dass Sie möglicherweise die Python-IDE installieren müssen, um das Bild anzuzeigen, und Sie sollten auch nach dem Fenster suchen, manchmal wird es nicht vorne angezeigt. Die Klammer in cv2.waitKey () ist vermutlich in Millisekunden und wenn Sie sie leer lassen, wird das Bild für immer angezeigt.
Ahmadiah

11

Wenn Sie in einer Python-Konsole ausgeführt werden, gehen Sie folgendermaßen vor:

img = cv2.imread("yourimage.jpg")

cv2.imshow("img", img); cv2.waitKey(0); cv2.destroyAllWindows()

Wenn Sie dann Enterauf das Bild drücken , wird das Bild erfolgreich geschlossen und Sie können andere Befehle ausführen.


7

Ich stand vor dem gleichen Problem. Ich habe versucht, ein Bild aus IDLE zu lesen und es mit anzuzeigen cv2.imshow(), aber das Anzeigefenster friert ein und wird angezeigtpythonw.exe nicht an, wenn versucht wird, das Fenster zu schließen.

Der folgende Beitrag gibt eine mögliche Erklärung dafür, warum dies geschieht

pythonw.exe antwortet nicht

" Tun Sie dies grundsätzlich nicht in IDLE. Schreiben Sie ein Skript und führen Sie es direkt in der Shell oder im Skript aus, indem Sie es mit einer .pyw-Erweiterung benennen und darauf doppelklicken. Es besteht anscheinend ein Konflikt zwischen dem IDLE-eigenen Ereignis Schleife und diejenigen aus GUI-Toolkits. "

Wenn ich imshow()ein Skript verwendet und ausgeführt habe, anstatt es direkt über IDLE auszuführen, hat es funktioniert.


Bitte fügen Sie die Erklärung unter dem Link hinzu (mindestens ein Minimum), da Links veraltet sein können ... Danke :)
Achedeuzot

Bump, da dies das Problem ist, das ich habe, aber ... "Tu das nicht" ist nicht die Antwort, die ich suche =)
Eric


4

Bei mir hat waitKey () mit einer Nummer größer als 0 funktioniert

    cv2.waitKey(1)

3

Sie haben alle notwendigen Teile irgendwo in diesem Thread:

if cv2.waitKey(): cv2.destroyAllWindows()

funktioniert gut für mich in IDLE.


3

Wenn Sie dies nicht zum Laufen gebracht haben, sollten Sie es besser sagen

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('Window',img)
cv2.waitKey(0)

in eine Datei und führen Sie es aus.


1

Benötigt keine zusätzlichen Methoden nach waitKey(0)(Antwort für obigen Code)

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('ImageWindow',img)
cv2.waitKey(0)

Fenster erscheint -> Klicken Sie auf das Fenster und klicken Sie auf Enter. Das Fenster wird geschlossen.


0

Wenn Sie "cv2.waitKey (0)" verwenden, stellen Sie sicher, dass Sie "cv2.waitKey (0)" anstelle von "cv2.waitkey (0)" geschrieben haben, da dieses Kleinbuchstaben "k" möglicherweise auch Ihr Programm einfriert .


3
Die Methode mit dem Kleinbuchstabenschlüssel ist in der API nicht vorhanden. Der Code würde einen Fehler auslösen, da die Methode nicht existiert.
Rayryeng

0

Ich hatte auch einen -215 Fehler. Ich dachte, imshow sei das Problem, aber als ich imread geändert habe, um eine nicht vorhandene Datei einzulesen, habe ich dort keinen Fehler erhalten. Also habe ich die Bilddatei in den Arbeitsordner gelegt und cv2.waitKey (0) hinzugefügt und es hat funktioniert.


-1

Fehler: (-215) size.width> 0 && size.height> 0 in der Funktion imshow

Dieser Fehler wird erzeugt, weil das Bild nicht gefunden wird. Es ist also kein Fehler der Imshow-Funktion.


Nicht relevant für diese Frage.
Rayryeng

-1

Ich hatte den gleichen Fehler, den ich überwinden konnte, indem ich den vollständigen Pfad zum Bild wie in C: \ Folder1 \ Folder2 \ filename.ext angegeben habe


Welcher "gleiche 215 Fehler"? Nirgendwo in der OP-Frage wird ein Fehler erwähnt. Außerdem verwendet OP einen vollständigen Pfad zum Bild, sodass ich nicht sehe, wie dies die Frage beantwortet.
Max Vollmer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.