opencv.imshow causa jupyter notebook crash

Check altra domanda su google o su stackoverflow, stanno parlando di eseguire cv2.imshow nello script, ma il mio l’esecuzione di codice in jupyter notebook.

Ecco la mia configurazione:

  1. ubuntu 16.4×64

  2. python 3.5

  3. opencv 3.1.0

Inizio un jupyter notebook: ecco il codice che ho messo notebook:

%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

Quando eseguo questo codice. immagine verrà visualizzato in una finestra pop-up, ma non riesco a chiudere la finestra cliccando sulla x in alto a destra, e un attimo dopo, il sistema richiederà di me che la finestra non risponde, mi darà 2 scelte: “attendere” , “fore chiudere”. se mi ha colpito di attendere, poi mostra lo stesso messaggio più tardi, Se ho colpito ‘fore esci’, poi il jupyter notebook kernel morire e devo ricominciare.

Ho google, molti soluzione suggeriscono che dovrei aggiungere questo codice

cv2.startWindowThread()

prima imshow, ma la situazione peggiorare, il kernel appendere per sempre!.
qualcuno ha qualche idea di cosa sta succedendo.

Qui è la foto del mio errore:
opencv.imshow causa jupyter notebook crash

  • cv.imshow non ha davvero senso in un ambiente client/server come Jupyter. Volete qualcosa di visualizzare l’immagine come parte del notebook (lato client), non per eseguire una GUI finestra sul lato server, che potrebbe un pò di “lavoro” quando il client e il server sono sulla stessa macchina, ma che su di esso. | Già in uso il imshow funzione da matplotlib (non numpy, come lei sembra pensare), così bastone con che (tenendo presente che si utilizza RGB piuttosto che BGR ordine di piani di colore).
  • Hai potuto trovare una soluzione a questo, sto avendo lo stesso problema, ho usato la libreria opencv un po ‘ così non waitkey problema. Succede solo all’ultimo imshow() prima che il programma termina, quindi, si mostra e distruggere windows, fino a quando è necessario chiudere la finestra finale(anche se è identico in tutta la prima come l’ultima iterazione di un ciclo).
InformationsquelleAutor scott huang | 2017-09-15



7 Replies
  1. 13
    %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()
    • Puoi aggiungere più dettagli alla tua risposta, per favore?
    • Utilizza la matplotlib libreria Python in modalità inline (così si può vedere sul Notebook). Quindi, si carica un’immagine con cv2 e poi vedi figura utilizzando matplotlib
    • Questo gist è un po ‘ più di info se interessati
  2. 7

    Ho avuto un problema simile, e non è potuto venire a una buona soluzione con cv2.imshow() in Jupyter Notebook. Ho seguito questo stackoverflow risposta, usando solo matplotlib per visualizzare l’immagine.

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

    Il La documentazione delle API per cv2.waitKey() note le seguenti:

    Questa funzione è l’unico metodo in HighGUI che può recuperare e gestire gli eventi, quindi deve essere periodicamente chiamati per la normale elaborazione di eventi, a meno che HighGUI viene utilizzato all’interno di un ambiente che si prende cura di elaborazione dell’evento.

    Quindi, forse, la chiamata alla funzione in un loop senza fine farebbe la finestra reattivo? Non ho provato questo, ma forse si vuole provare il seguente:

    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')
    • È inoltre possibile utilizzare cv2.destroyAllWindows() al fine di distruggere tutte le finestre.
    • grande risposta, ha funzionato perfettamente grazie @Saibot
  4. 4

    Semplice.È necessario capire che cosa sta accadendo.

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

    waitKey(0) metodo è in attesa di un input all’infinito. Quando si vede un fotogramma di un’immagine corrispondente, non tentare di chiudere l’immagine usando chiudi nell’angolo superiore destro.

    Invece di premere qualche tasto. waitkey metodo che prendono come input e restituiscono un valore. Inoltre, è possibile anche controllare che la pressione del tasto per chiudere il telaio.

    Inoltre waitKey(33) mancherà di tenere il telaio attivo per 33 ms e quindi chiudere automaticamente.

    destroyWindow() distruggere il fotogramma corrente se c’.
    destroyAllWindows() distruggerà tutti i fotogrammi attualmente presente.

    Questo risolverà.

    • Non sono sicuro waitkey è la causa di questo problema, mi sto divertendo troppo.
    • Questo è stato il caso per me. Il matplotlib risposte pubblicate qui sembra essere la sola soluzione, piuttosto che in realtà spiegando il motivo del crash/punto di congelamento.
    • l’aggiunta di attendere chiave e distruggere la finestra non aiuta. notebook si blocca ancora
  5. 1

    Nuova finestra che si apre dalla Jupyter utilizza lo stesso kernel di un notebook. Basta aggiungere questo di seguito il codice e funzionava bene.

    cv2.waitKey(0)
    cv2.destroyAllWindows()
    • Benvenuti a TANTO!!! Potresti modificare il tuo post e spiegare in breve di cosa si sta facendo, per favore?
  6. 0

    Il seguente codice funziona bene in Jupyter per visualizzare un’immagine

    %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()

    Se si desidera visualizzare il video invece di un’immagine in una finestra separata, utilizzare il codice riportato di seguito:

    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()

    Assicurarsi che il nome della finestra partita, altrimenti non funziona. In questo caso io uso “immagine” come nome della finestra.

  7. -1

    Io non sono sicuro se è possibile aprire una finestra da Jupyter Notebook.
    cv2.imshow si aspetta un waitKey che non funziona in Jupyter.

    Qui è che cosa ho fatto (utilizzo di OpenCV 3.3):

    from IPython.display import display, HTML
    import cv2
    import base64
    
    def imshow(name, imageArray):
         _, png = cv2.imencode('.png', imageArray)
         encoded = base64.b64encode(png)
         return HTML(data='''<img alt="{0}" src="data:image/png;base64, {1}"/>'''.format(name, encoded.decode('ascii')))
    
    img = cv2.imread('./media/baboon.jpg',cv2.IMREAD_COLOR)
    imshow('baboon', img)

    Se non avete bisogno di utilizzare cv2, solo:

    from IPython.display import Image
    Image('./media/baboon.jpg')

Lascia un commento