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?

top.eng
quelle
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.)

berak
quelle
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)
Akhorus
quelle
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)
AdityaIntwala
quelle
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.

Dharma
quelle
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.

rkdasari
quelle
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
7

cv2.waitKey(0)am Ende hinzufügen .

Pygirl
quelle
4

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

    cv2.waitKey(1)
Rambod
quelle
3

Sie haben alle notwendigen Teile irgendwo in diesem Thread:

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

funktioniert gut für mich in IDLE.

iamchriskelley
quelle
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.

Joseph
quelle
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.

Ravi Chandra Veeramachaneni
quelle
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 .

Guilherme Girão
quelle
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.

CirculationDept
quelle
-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.

Alvaro Fernandez
quelle
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

user3458364
quelle
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