La commande cv2.imshow ne fonctionne pas correctement dans opencv-python


111

J'utilise opencv 2.4.2, python 2.7 Le code simple suivant a créé une fenêtre du nom correct, mais son contenu est juste vide et n'affiche pas l'image:

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('ImageWindow',img)

est-ce que quelqu'un est au courant de ce problème?


Votre chemin de fichier est peut-être incorrect. Windows utilise \ not /. Je ne sais pas si OpenCV tolère / sous Windows? Si cela ne résout pas le problème, assurez-vous que votre image est au bon emplacement et qu'elle est une image valide.
fmw42 le

Il y a un tutoriel avec les bases de la lecture / affichage des images dans docs.opencv.org/master/dc/d2e/tutorial_py_image_display.html
kon psych

Réponses:


228

imshow()fonctionne uniquement avec waitKey():

import cv2
img = cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('ImageWindow', img)
cv2.waitKey()

(Toute la boucle de message nécessaire à la mise à jour de la fenêtre y est cachée.)


3
check print imgimprime un tableau numpy correct, pas un NoneTypeobjet.
Abid Rahman K

7
Juste pour être clair pour la postérité, dans des circonstances normales, ce serait la bonne réponse. L'omission de waitKey entraînera (généralement) exactement le comportement décrit dans la question.
Snesticle

45

J'ai trouvé la réponse qui a fonctionné pour moi ici: http://txt.arboreus.com/2012/07/11/highgui-opencv-window-from-ipython.html

Si vous exécutez une session ipython interactive et que vous souhaitez utiliser des fenêtres highgui, commencez par cv2.startWindowThread ().

En détail: HighGUI est une interface simplifiée pour afficher des images et des vidéos à partir du code OpenCV. Cela devrait être aussi simple que:

import cv2
img = cv2.imread("image.jpg")
cv2.startWindowThread()
cv2.namedWindow("preview")
cv2.imshow("preview", img)

7
Vous pouvez le fermer par la suite par cv2.destroyAllWindows ()
Zuza

Pour l'implémentation QT de highgui, startWindowThread () ne fait rien. github.com/opencv/opencv/blob/…
kusi le

24

Vous devez utiliser cv2.waitKey(0)après cv2.imshow("window",img). Ce n'est qu'alors que cela fonctionnera.

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('Window',img)
cv2.waitKey(0)

J'ajouterais que vous devrez peut-être installer l'IDE python pour afficher l'image et que vous devriez également rechercher la fenêtre parfois ne l'affiche pas devant. Je suppose que la parenthèse dans cv2.waitKey () est en millièmes de seconde et si vous laissez vide, l'image affichera pour toujours.
Ahmadiah

11

Si vous exécutez dans une console Python, procédez comme suit:

img = cv2.imread("yourimage.jpg")

cv2.imshow("img", img); cv2.waitKey(0); cv2.destroyAllWindows()

Ensuite, si vous appuyez Entersur l'image, cela fermera l'image avec succès et vous pourrez continuer à exécuter d'autres commandes.


7

J'ai fait face au même problème. J'ai essayé de lire une image de IDLE et essayé de l'afficher en utilisant cv2.imshow(), mais la fenêtre d'affichage se fige et montre qu'elle pythonw.exene répond pas en essayant de fermer la fenêtre.

Le post ci-dessous explique pourquoi cela se produit

pythonw.exe ne répond pas

" Fondamentalement, ne faites pas cela depuis IDLE. Écrivez un script et exécutez-le à partir du shell ou du script directement si dans Windows, en le nommant avec une extension .pyw et en double-cliquant dessus. Il y a apparemment un conflit entre le propre événement d'IDLE. loop et ceux des toolkits GUI. "

Quand je l'ai utilisé imshow()dans un script et que je l'exécute plutôt que de l'exécuter directement sur IDLE, cela fonctionnait.


Veuillez ajouter l'explication fournie sur le lien (au moins au moins) car les liens peuvent devenir obsolètes ... Merci :)
achedeuzot

Bump puisque c'est le problème que j'ai mais ... "ne pas faire ça" n'est pas la réponse que je recherche =)
Eric


4

Pour moi, waitKey () avec un nombre supérieur à 0 a fonctionné

    cv2.waitKey(1)

3

Vous avez toutes les pièces nécessaires quelque part dans ce fil:

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

fonctionne bien pour moi dans IDLE.


3

Si vous ne l'avez pas fait, vous feriez mieux de mettre

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('Window',img)
cv2.waitKey(0)

dans un fichier et exécutez-le.


1

N'a pas besoin de méthodes supplémentaires après waitKey(0)(réponse pour le code ci-dessus)

import cv2
img=cv2.imread('C:/Python27/03323_HD.jpg')
cv2.imshow('ImageWindow',img)
cv2.waitKey(0)

La fenêtre apparaît -> Cliquez sur la fenêtre et cliquez sur Entrée. La fenêtre se fermera.


0

Si vous choisissez d'utiliser «cv2.waitKey (0)», assurez-vous que vous avez écrit «cv2.waitKey (0)» au lieu de «cv2.waitkey (0)», car ce «k» minuscule peut également geler votre programme .


3
La méthode avec la clé minuscule n'existe pas dans l'API. Le code générerait une erreur car la méthode n'existe pas.
rayryeng le

0

J'ai également eu une erreur -215. Je pensais qu'imshow était le problème, mais quand j'ai changé imread pour lire dans un fichier inexistant, je n'ai eu aucune erreur. J'ai donc mis le fichier image dans le dossier de travail et ajouté cv2.waitKey (0) et cela a fonctionné.


-1

erreur: (-215) size.width> 0 && size.height> 0 dans la fonction imshow

Cette erreur est produite car l'image est introuvable. Ce n'est donc pas une erreur de la fonction imshow.


Pas pertinent pour cette question.
rayryeng le

-1

J'ai eu la même erreur 215, que j'ai pu surmonter en donnant le chemin complet de l'image, comme dans C: \ Folder1 \ Folder2 \ filename.ext


Quelle "même erreur 215"? Nulle part dans la question des OP, aucune erreur n'est mentionnée. OP utilise également un chemin d'accès complet à l'image, donc je ne vois pas comment cela répond à la question.
Max Vollmer le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.