webentwicklung-frage-antwort-db.com.de

opencv.imshow führt zum Absturz des Jupyter-Notebooks

Ich überprüfe andere Fragen bei Google oder Stackoverflow. Sie sprechen von der Ausführung von cv2.imshow im Skript, aber mein Code läuft in einem Jupyter-Notebook.

Hier ist meine Konfiguration:

  1. ubuntu 16,4 x 64

  2. python 3.5

  3. opencv 3.1.0

Ich starte ein Jupyter-Notebook: Hier ist der Code, den ich in das Notebook gesteckt habe:

%pylab notebook
import cv2

cvim2disp = cv2.imread('data/home.jpg')
cv2.imshow('HelloWorld', cvim2disp)
cv2.waitKey() #image will not show until this is called
cv2.destroyWindow('HelloWorld') #make sure window closes cleanly

Wenn ich diesen Code ausführen. Das Bild wird in einem Popup-Fenster angezeigt, aber ich kann dieses Fenster nicht schließen, indem Sie auf das x in der oberen rechten Ecke klicken. Einen Moment später wird das System Sie darauf hinweisen, dass das Fenster nicht reagiert. Es gibt zwei Möglichkeiten: " warte "," fore quit ". Wenn ich auf "Warten" klicke, wird die gleiche Aufforderung später angezeigt. Wenn ich auf "Fore Quit" geklickt habe, stirbt der Jupyter-Notebook-Kernel und ich muss von vorne beginnen.

Ich google herum, viele Lösungen schlagen vor, dass ich diesen Code hinzufügen sollte 

cv2.startWindowThread()

vor imshow, aber die Situation verschlechtert sich, der Kernel hängt für immer! Jeder hat eine Idee, was los ist.

Hier ist das Bild meines Fehlers:  enter image description here

10
scott huang
%matplotlib inline
#The line above is necesary to show Matplotlib's plots inside a Jupyter Notebook

import cv2
from matplotlib import pyplot as plt

#Import image
image = cv2.imread("input_path")

#Show the image with matplotlib
plt.imshow(image)
plt.show()
7
Ritu dhoot

Ich hatte ein ähnliches Problem und konnte mit cv2.imshow() im Jupyter Notebook keine gute Lösung finden. Ich folgte dieser stackoverflow-Antwort und benutzte einfach matplotlib, um das Bild anzuzeigen.

import matplotlib.pyplot as plt
# load image using cv2....and do processing.
plt.imshow(cv2.cvtColor(image, cv2.BGR2RGB))
# as opencv loads in BGR format by default, we want to show it in RGB.
plt.show()
3
mannyglover

Es ist einfach. Sie müssen verstehen, was passiert.

import cv2
cvim2disp = cv2.imread('data/home.jpg')
cv2.imshow('HelloWorld', cvim2disp)
cv2.waitKey(0) 
cv2.destroyWindow()

die waitKey (0) -Methode wartet unendlich lange auf eine Eingabe. Versuchen Sie nicht, das Bild mit Schließen in der rechten oberen Ecke zu schließen, wenn Sie einen Rahmen des entsprechenden Bildes sehen. 

Drücken Sie stattdessen eine Taste. Die waitkey-Methode nimmt dies als Eingabe und gibt einen Wert zurück. Sie können auch überprüfen, welche Taste gedrückt wurde, um den Rahmen zu schließen.

Zusätzlich behält waitKey (33) den Frame für 33 ms aktiv und schließt ihn dann automatisch.

destroyWindow () zerstört den aktuellen Frame, wenn dort . destroyAllWindows () alle derzeit vorhandenen Frames zerstört.

Das wird sich lösen.

1
Vivek Kumar

Das neue Fenster, das von Jupyter aus geöffnet wird, verwendet denselben Kernel wie Notebook. Füge dies einfach unten zum Code hinzu und es würde gut funktionieren.

cv2.waitKey(0)
cv2.destroyAllWindows()
1
Abhinav Bangia

Die API-Dokumentation für cv2.waitKey () stellt Folgendes fest:

Diese Funktion ist die einzige Methode in HighGUI, die Ereignisse abrufen und verarbeiten kann. Daher muss sie regelmäßig für die normale Ereignisverarbeitung aufgerufen werden, es sei denn, HighGUI wird in einer Umgebung verwendet, die sich um die Ereignisverarbeitung kümmert.

Das Aufrufen der Funktion in einer Endlosschleife würde das Fenster also ansprechen lassen. Ich habe das nicht getestet, aber vielleicht möchten Sie Folgendes versuchen:

import cv2

cvim2disp = cv2.imread('data/home.jpg')
cv2.imshow('img', cvim2disp)
while(True):
    k = cv2.waitKey(33)
    if k == -1:  # if no key was pressed, -1 is returned
        continue
    else:
        break
cv2.destroyWindow('img')
1
Saibot

Der folgende Code funktioniert in Jupyter gut, um ein Bild anzuzeigen

%matplotlib inline
import cv2
from matplotlib import pyplot as plt
cap = cv2.VideoCapture(videoFName)
ret, image = cap.read()
image=cv2.resize(image,None,fx=0.25,fy=0.25,interpolation=cv2.INTER_AREA)
plt.imshow(image)
plt.show()

Wenn Sie das Video anstelle eines Bildes in einem separaten Fenster anzeigen möchten, verwenden Sie den folgenden Code:

import cv2
cap = cv2.VideoCapture(videoFName)
while cap.isOpened():
    ret, image = cap.read()
    image=cv2.resize(image,None,fx=0.25,fy=0.25,interpolation=cv2.INTER_AREA)
    cv2.imshow('image',image)

    k = cv2.waitKey(30) & 0xff # press ESC to exit
    if k == 27 or cv2.getWindowProperty('image', 0)<0:
        break
cv2.destroyAllWindows()
cap.release()

Stellen Sie sicher, dass der Name des Fensters übereinstimmt, andernfalls funktioniert es nicht. In diesem Fall verwende ich "image" als Fensternamen.

0
Kardi Teknomo