web-dev-qa-db-fra.com

opencv.imshow va provoquer un crash de l'ordinateur portable jupyter

Je vérifie une autre question sur google ou stackoverflow, ils parlent d’exécuter cv2.imshow dans un script, mais mon code s’exécute dans jupyter notebook.

Voici ma configuration:

  1. ubuntu 16.4x64

  2. python 3.5

  3. ouverture 3.1.0

Je lance un cahier jupyter: voici le code que je mets cahier:

%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

Quand j'exécute ces codes. l'image apparaîtra dans une fenêtre contextuelle, mais je ne peux pas fermer cette fenêtre en cliquant sur le x dans le coin supérieur droit, et un moment plus tard, le système me dira que la fenêtre ne répond pas, cela me donnera 2 choix: " attendez "," avant de quitter ". si je clique sur wait, le message Invite apparaît plus tard, si je clique sur 'avant de quitter', le noyau du cahier jupyter meurt et je dois tout recommencer.

Je google autour, de nombreuses solutions suggèrent que je devrais ajouter ce code 

cv2.startWindowThread()

avant imshow, mais la situation s’aggrave, le noyau est bloqué pour toujours !. quiconque a une idée de ce qui se passe.

Voici la photo de mon erreur:  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

J'avais un problème similaire et je ne pouvais pas trouver de solution satisfaisante avec cv2.imshow() dans le cahier Jupyter. J'ai suivi cette réponse stackoverflow , juste en utilisant matplotlib pour afficher l'image.

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

C'est simple. Vous devez comprendre ce qui se passe.

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

la méthode waitKey (0) attend une entrée indéfiniment. Lorsque vous voyez un cadre de l'image correspondante, n'essayez pas de fermer l'image avec fermer dans le coin supérieur droit. 

Appuyez plutôt sur une touche. La méthode waitkey prendra cela comme une entrée et retournera une valeur. Vous pouvez également vérifier quelle touche a été enfoncée pour fermer le cadre.

De plus, waitKey (33) maintiendra la trame active pendant 33 ms, puis la fermera automatiquement.

destroyWindow () détruira le cadre actuel si . destroyAllWindows () détruira tous les cadres présents.

Cela va résoudre.

1
Vivek Kumar

La documentation de API pour cv2.waitKey () note les remarques suivantes:

Cette fonction est la seule méthode de HighGUI capable d'extraire et de gérer les événements. Elle doit donc être appelée périodiquement pour le traitement d'événements normal, à moins que HighGUI ne soit utilisé dans un environnement prenant en charge le traitement des événements.

Alors peut-être qu'appeler la fonction dans une boucle sans fin rendrait la fenêtre sensible? Je n'ai pas testé cela, mais peut-être aimeriez-vous essayer ce qui suit:

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

Le code suivant fonctionne bien dans Jupyter pour afficher une image

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

Si vous souhaitez afficher la vidéo au lieu d'une image dans une fenêtre séparée, utilisez le code suivant:

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

Assurez-vous que le nom de la fenêtre correspond, sinon cela ne fonctionnera pas. Dans ce cas, j'utilise "image" comme nom de fenêtre.

0
Kardi Teknomo