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?

top.eng
la source
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.)

berak
la source
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)
Akhorus
la source
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)
AdityaIntwala
la source
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.

Dharma
la source
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.

rkdasari
la source
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
7

ajouter cv2.waitKey(0)à la fin.

Pygirl
la source
4

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

    cv2.waitKey(1)
Rambod
la source
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.

iamchriskelley
la source
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.

Joseph
la source
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.

Ravi Chandra Veeramachaneni
la source
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 .

Guilherme Girão
la source
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é.

CirculationDept
la source
-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.

Alvaro Fernandez
la source
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

user3458364
la source
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