Il comando cv2.imshow non funziona correttamente in opencv-python


111

Sto usando opencv 2.4.2, python 2.7 Il seguente semplice codice ha creato una finestra con il nome corretto, ma il suo contenuto è solo vuoto e non mostra l'immagine:

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

qualcuno sa di questo problema?


Il percorso del tuo file potrebbe essere sbagliato. Windows utilizza \ not /. Non sono sicuro che OpenCV tolleri / su Windows? Se la correzione non aiuta, assicurati che l'immagine sia nella posizione corretta e sia un'immagine valida.
fmw42

C'è un tutorial con le basi della lettura / visualizzazione di immagini in docs.opencv.org/master/dc/d2e/tutorial_py_image_display.html
kon psych

Risposte:


228

imshow()funziona solo con waitKey():

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

(L'intero ciclo di messaggi necessario per aggiornare la finestra è nascosto lì.)


3
check print imgstampa un array numpy corretto, non un NoneTypeoggetto.
Abid Rahman K

7
Giusto per essere chiari ai posteri, in circostanze normali questa sarebbe la risposta corretta. Omettendo waitKey (di solito) si otterrà esattamente il comportamento descritto nella domanda.
Snesticle

45

Ho trovato la risposta che ha funzionato per me qui: http://txt.arboreus.com/2012/07/11/highgui-opencv-window-from-ipython.html

Se esegui una sessione ipython interattiva e desideri utilizzare Windows HighGui, esegui prima cv2.startWindowThread ().

In dettaglio: HighGUI è un'interfaccia semplificata per visualizzare immagini e video dal codice OpenCV. Dovrebbe essere facile come:

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

7
Puoi chiuderlo in seguito da cv2.destroyAllWindows ()
Zuza

Per l'implementazione QT di highgui, startWindowThread () non fa nulla. github.com/opencv/opencv/blob/…
kusi

24

Devi usare cv2.waitKey(0)dopo cv2.imshow("window",img). Solo allora funzionerà.

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

Vorrei aggiungere che potresti dover installare l'IDE python per visualizzare l'immagine e dovresti anche cercare la finestra a volte se non la visualizza in primo piano. La parentesi in cv2.waitKey () presumo sia in milsecond e se lasci il campo vuoto mostrerà l'immagine per sempre.
Ahmadiah

11

Se stai utilizzando una console Python, fai questo:

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

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

Quindi se premi Entersull'immagine, questa chiuderà correttamente l'immagine e potrai procedere eseguendo altri comandi.


7

Ho affrontato lo stesso problema. Ho provato a leggere un'immagine da IDLE e ho provato a visualizzarla utilizzando cv2.imshow(), ma la finestra di visualizzazione si blocca e mostra che pythonw.exenon risponde quando si tenta di chiudere la finestra.

Il post di seguito fornisce una possibile spiegazione del motivo per cui ciò sta accadendo

pythonw.exe non risponde

" Fondamentalmente, non farlo da IDLE. Scrivi uno script ed eseguilo dalla shell o direttamente dallo script se in Windows, nominandolo con un'estensione .pyw e facendo doppio clic su di esso. Apparentemente c'è un conflitto tra l'evento stesso di IDLE loop e quelli dei toolkit della GUI. "

Quando l'ho usato imshow()in uno script e lo ho eseguito invece di eseguirlo direttamente su IDLE, ha funzionato.


Si prega di aggiungere la spiegazione fornita al collegamento (almeno almeno) perché i collegamenti possono diventare
obsoleti

Bump poiché questo è il problema che ho ma ... "non farlo" non è la risposta che sto cercando =)
Eric


4

Per me waitKey () con numero maggiore di 0 ha funzionato

    cv2.waitKey(1)

3

Hai tutti i pezzi necessari da qualche parte in questo thread:

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

funziona bene per me in IDLE.


3

Se non l'hai fatto funzionare, è meglio che metta

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

in un file ed eseguirlo.


1

Non necessita di metodi aggiuntivi dopo waitKey(0)(risposta per il codice sopra)

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

Viene visualizzata la finestra -> Fare clic sulla finestra e fare clic su Invio. La finestra si chiuderà.


0

Se scegli di utilizzare "cv2.waitKey (0)", assicurati di aver scritto "cv2.waitKey (0)" invece di "cv2.waitkey (0)", perché anche quella "k" minuscola potrebbe bloccare il tuo programma .


3
Il metodo con la chiave minuscola non esiste nell'API. Il codice genererebbe un errore poiché il metodo non esiste.
rayryeng

0

Ho anche avuto un errore -215. Pensavo che imshow fosse il problema, ma quando ho cambiato imread in un file inesistente non ho ricevuto alcun errore. Quindi ho inserito il file immagine nella cartella di lavoro e ho aggiunto cv2.waitKey (0) e ha funzionato.


-1

errore: (-215) size.width> 0 && size.height> 0 nella funzione imshow

Questo errore viene prodotto perché l'immagine non viene trovata. Quindi non è un errore della funzione imshow.


Non pertinente a questa domanda.
rayryeng

-1

Ho avuto lo stesso errore 215, che sono stato in grado di superare dando il percorso completo all'immagine, come in C: \ Folder1 \ Folder2 \ filename.ext


Quale "stesso errore 215"? In nessun punto della domanda degli OP viene menzionato alcun errore. Inoltre OP sta utilizzando un percorso completo per l'immagine, quindi non vedo come questo risponde alla domanda.
Max Vollmer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.