web-dev-qa-db-de.com

die Funktion cv2.imshow () öffnet ein Fenster, in dem immer die Meldung angezeigt wird, dass sie nicht reagiert - Python opencv

Ich versuche, ein sehr einfaches Programm auszuführen. Öffnen Sie die jpg-Datei und zeigen Sie sie mit der opencv-Bibliothek für Python an. Anfangs hat alles gut funktioniert, aber jetzt öffnet sich einfach ein Fenster, in dem das Bild nicht angezeigt wird, aber "Nicht reagieren" angezeigt wird. Ich muss zum Taskmanager gehen und ihn schließen!

from numpy import *
import matplotlib as plt
import cv2

img = cv2.imread('amandapeet.jpg')
print img.shape

cv2.imshow('Amanda', img)
17
vicky

Sie haben eine weitere Zeile verpasst:

cv2.waitKey(0)

Dann zeigt das Fenster das Bild, bis Sie eine beliebige Taste auf der Tastatur drücken. Oder du kannst wie folgt weitergeben:

cv2.waitKey(1000)
cv2.destroyAllWindows()

Hier zeigt das Fenster ein Bild für 1000 ms oder 1 Sekunde. Danach verschwand das Fenster von selbst. Aber in manchen Fällen wird das nicht der Fall sein. So können Sie es mit cv2.destroyAllWindows () gewaltsam zerstören

Bitte lesen Sie zuerst weitere Tutorials: http://docs.opencv.org/trunk/doc/py_tutorials/py_tutorials.html

37
Abid Rahman K

Keine der Antworten funktionierte hier in MacOS. Die folgenden Arbeiten:

Fügen Sie einfach eine cv2.waitKey(1) after cv2.destroyAllWindows() hinzu.

Beispiel:

import cv2
image = cv2.imread('my_image.jpg')
cv2.imshow('HSV image', hsv_image); cv2.waitKey(0); cv2.destroyAllWindows(); cv2.waitKey(1)
5
Julio

Ich habe vor kurzem mit opencv 3.2 und matplotlib gearbeitet und habe durch Versuch und Irrtum des Kommentierens von Zeilen herausgefunden, dass der Import von Pyplot aus matplotlib mit der Funktion cv2.imshow () in irgendeiner Weise interferiert. Ich bin nicht sicher, warum oder wie es wirklich funktioniert, aber falls jemand nach diesem Problem sucht und auf dieses alte Forum stößt, könnte dies helfen. Ich arbeite daran, eine Lösung zu finden, um diese Störungen zu beheben

2
Madelyn A.

Die Lösung, die für mich funktioniert hat: Wechseln Sie von Inline Grafik zu Auto. Es funktionierte sowohl in Spyder als auch in Jupyter Notizbüchern.

  • m die Spyder-Einstellung zu ändern: Gehen Sie zu Extras > Einstellungen > IPhyton-Konsole > Grafik > Backend: Automatisch (Ändern Backend von Inline nach Automatic)
  • Notizbucheinstellung ändern: Befehl eingeben:

    % matplotlib auto


Einige Hintergründe für meinen Fall (für diejenigen, die schnell urteilen können) :

Früher hat es funktioniert: Ich konnte ein Bild öffnen, es wurde geladen und es reagierte (sagt nicht "Nicht reagieren", kann schließen, fokussieren usw.). Dann habe ich einige Pakete installiert und einige Demo-Notebooks ausgeführt, die Anscheinend sind einige Einstellungen durcheinander gekommen (auch die geöffneten Spyder-Dateien wurden zurückgesetzt).

Ich habe versucht, waitKey (1) hinzuzufügen (und 0, 30, 1000 usw. Werte auch). Zumindest das Bild wurde geladen. Aber der Bilderrahmen reagierte nicht: wurde nicht aktualisiert, konnte nicht geschlossen werden, kam nicht nach oben usw. Musste mit cv2.destroyAllWindows () geschlossen werden.

Beachten Sie, dass während der Laufzeit von waitKey alles einwandfrei funktioniert hat. Ich habe dies in eine Schleife gelegt, die dasselbe Bild im selben benannten Fenster zeigt und einige Sekunden wartet. Während der Schleife funktioniert alles gut. Sobald die Schleife endet, antwortet das Bildfenster nicht (was wie ein GUI-Thread-Problem aussieht). Ich habe versucht, cv2.startWindowThread () zu verwenden und keinen Unterschied gemacht.

Schließlich brachte der Wechsel von Inline-Grafiken zu Auto alles wieder in Ordnung.

0
Kadir A. Peker

Ich hatte den gleichen Fehler, bis ich die folgenden Codezeilen hinzufügte. Für den waitKey können Sie Zahlen über 0 eingeben (d. H. 1, 100 und höher). Sie dient als Verzögerungszeit für das Fenster und wird in Millisekunden angegeben.

----> cv2 waitKey (0) ----> cv2 destroyAllWindows ()

0

Wenn Sie Python-Notebooks verwendet haben, besteht ein Problem bei der Verwendung von cv2.waitKey (0) und cv2.destroyallwindows () in Unix-basierten Systemen, um ein Programm von opencv auszuführen.

Ich habe eine alternative Methode, die das Einfrieren Ihres Bildes verhindern würde

Schritte: - Kopieren Sie den Code aus Python-Notizbüchern, erstellen Sie einen neuen Dateinamen.py und fügen Sie ihn ein - Öffnen Sie das Terminal - cd-Pfad/zur/Datei /. /

Dadurch wird der Code direkt vom Terminal ausgeführt. Hoffe das hilft dir. Beispiellink: https://youtu.be/8O-FW4Wm10s

0
R K Bhalodia

Die Funktion cv2.imshow () benötigt immer zwei weitere Funktionen, um das Bild zu laden und zu schließen. Diese beiden Funktionen sind cv2.waitKey () und cv2.destroyAllWindows (). In der Funktion cv2.waitKey () können Sie einen beliebigen Wert angeben, um das Bild zu schließen und mit weiteren Codezeilen fortzufahren.

    # First line will provide resizing ability to the window
    cv.namedWindow('Amanda', cv.WINDOW_AUTOSIZE)

    # Show the image, note that the name of the output window must be same
    cv.imshow('Amanda', img)

    # T0 load and hold the image
    cv.waitKey(0)

    # To close the window after the required kill value was provided
    cv.destroyAllWindows()

Ich hoffe, dass Sie das Bild jetzt in einem separaten Fenster erhalten.

0
Rajkamal Mishra

Ich war auch mit dem gleichen Problem konfrontiert. Ich führe die Befehlszeile python Prompt in centos 7 mit dem folgenden Code aus

>> import cv2, numpy as np
>> cap=cv2.VideoCapture(0)
>> img=cap.read()
>> cap.release()
>> cv2.imshow('image',img[1])
>> cv2.waitKey(0)
>> cv2.destroyAllWindows()
>> cv2.waitKey(1)

Selbst dann blieb das Problem bestehen und löste sich nicht. Also habe ich hinzugefügt

>> cv2.imshow('image',img[1])

Durch das Hinzufügen dieses Fensters wurde das Bildfenster geschlossen. Wenn Sie den Befehl erneut ausführen, wird eine neue Instanz erstellt. Ich hoffe, Sie können es versuchen, wenn Sie immer noch Probleme haben.

0
shiva