Polecenie cv2.imshow nie działa poprawnie w opencv-python


111

Używam opencv 2.4.2, python 2.7 Poniższy prosty kod utworzył okno o poprawnej nazwie, ale jego zawartość jest po prostu pusta i nie pokazuje obrazu:

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

czy ktoś wie o tym problemie?


Ścieżka do pliku może być nieprawidłowa. Windows używa \ not /. Nie jestem pewien, czy OpenCV toleruje / w systemie Windows? Jeśli naprawienie tego nie pomoże, upewnij się, że obraz znajduje się we właściwej lokalizacji i jest prawidłowy.
fmw42

Istnieje samouczek z podstawami czytania / wyświetlania obrazów w docs.opencv.org/master/dc/d2e/tutorial_py_image_display.html
kon

Odpowiedzi:


228

imshow()działa tylko z waitKey():

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

(Cała pętla komunikatów potrzebna do aktualizacji okna jest tam ukryta).


3
check print imgwypisuje poprawną tablicę numpy, a nie NoneTypeobiekt.
Abid Rahman K,

7
Żeby było jasne dla potomności, w normalnych okolicznościach byłaby to poprawna odpowiedź. Pominięcie waitKey (zazwyczaj) spowoduje zachowanie dokładnie opisane w pytaniu.
Snesticle

45

Znalazłem odpowiedź, która mi pomogła : http://txt.arboreus.com/2012/07/11/highgui-opencv-window-from-ipython.html

Jeśli uruchamiasz interaktywną sesję ipython i chcesz używać okien highgui, najpierw wykonaj cv2.startWindowThread ().

W szczegółach: HighGUI to uproszczony interfejs do wyświetlania obrazów i wideo z kodu OpenCV. To powinno być tak proste, jak:

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

7
Możesz go później zamknąć przez cv2.destroyAllWindows ()
Zuza

W przypadku implementacji highgui w QT metoda startWindowThread () nic nie robi. github.com/opencv/opencv/blob/…
kusi

24

Musisz użyć cv2.waitKey(0)później cv2.imshow("window",img). Tylko wtedy to zadziała.

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

Dodałbym, że może być konieczne zainstalowanie środowiska Python IDE, aby wyświetlić obraz, a także powinieneś poszukać okna, które czasami nie wyświetla go z przodu. Zakładam, że nawias w cv2.waitKey () jest wyrażony w milsekundach i jeśli zostawisz puste miejsce, będzie wyświetlał obraz na zawsze.
Ahmadiah,

11

Jeśli korzystasz z konsoli Pythona, zrób to:

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

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

Następnie, jeśli naciśniesz Enterna obraz, pomyślnie zamkniesz obraz i możesz kontynuować uruchamianie innych poleceń.


7

Miałem ten sam problem. Próbowałem odczytać obraz z IDLE i próbowałem go wyświetlić cv2.imshow(), ale okno wyświetlacza zawiesza się i pokazujepythonw.exe nie reagują podczas próby zamknięcia okna.

Poniższy post zawiera możliwe wyjaśnienie, dlaczego tak się dzieje

pythonw.exe nie odpowiada

Zasadniczo nie rób tego z IDLE. Napisz skrypt i uruchom go z powłoki lub skryptu bezpośrednio w systemie Windows, nadając mu nazwę z rozszerzeniem .pyw i klikając dwukrotnie. Najwyraźniej występuje konflikt między własnym zdarzeniem IDLE loop i te z zestawów narzędzi GUI. "

Kiedy użyłem imshow()w skrypcie i wykonałem go, zamiast uruchamiać go bezpośrednio przez IDLE, zadziałało.


Dodaj wyjaśnienie podane pod linkiem (przynajmniej), ponieważ linki mogą się zestarzeć ... Dzięki :)
achedeuzot

Uderzenie, ponieważ jest to problem, który mam, ale ... „nie rób tego” nie jest odpowiedzią, której szukam =)
Eric


4

U mnie waitKey () o numerze większym niż 0 zadziałało

    cv2.waitKey(1)

3

Masz gdzieś w tym wątku wszystkie potrzebne elementy:

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

działa dobrze dla mnie w IDLE.


3

Jeśli nie sprawiłeś, że to zadziałało, lepiej to załóż

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

do jednego pliku i uruchom go.


1

Nie potrzebuje żadnych dodatkowych metod po waitKey(0)(odpowiedz na powyższy kod)

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

Pojawi się okno -> Kliknij okno i kliknij Enter. Okno się zamknie.


1

Metoda 1:

Poniższy kod zadziałał dla mnie. Samo dodanie niszczącej wszystkich okien () nie zamknęło okna. Dodanie kolejnego cv2.waitKey (1) na końcu załatwiło sprawę.

im = cv2.imread("./input.jpg")
cv2.imshow("image", im)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)

kredyt: https://stackoverflow.com/a/50091712/8109630

Uwaga dla początkujących:

  • Spowoduje to otwarcie obrazu w osobnym oknie, zamiast wyświetlania go w notatniku. Dlatego musimy użyć metody zniszczAllWindows (), aby ją później zamknąć.
  • Jeśli więc nie widzisz wyskakującego okna, sprawdź, czy znajduje się za bieżącym oknem.
  • Po obejrzeniu obrazu naciśnij klawisz, aby zamknąć wyskakujące okno.

Metoda 2:

Jeśli chcesz wyświetlić na notebooku Jupyter.

from matplotlib import pyplot as plt
import cv2

im = cv2.imread("./input.jpg")
color = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
plt.imshow(color)
plt.title('Image')
plt.show()

0

Jeśli zdecydujesz się użyć „cv2.waitKey (0)”, upewnij się, że napisałeś „cv2.waitKey (0)” zamiast „cv2.waitkey (0)”, ponieważ ta mała litera „k” może również spowodować zawieszenie programu .


3
Metoda z kluczem z małych liter nie istnieje w interfejsie API. Kod zwróciłby błąd, ponieważ metoda nie istnieje.
rayryeng

0

Miałem też błąd -215. Myślałem, że problemem jest imshow, ale kiedy zmieniłem imread na odczyt w nieistniejącym pliku, nie widziałem błędu. Więc umieściłem plik obrazu w folderze roboczym i dodałem cv2.waitKey (0) i zadziałało.


-1

błąd: (-215) size.width> 0 && size.height> 0 w funkcji imshow

Ten błąd jest generowany, ponieważ nie znaleziono obrazu. Więc to nie jest błąd funkcji imshow.


Nie dotyczy tego pytania.
rayryeng

-1

Miałem ten sam błąd 215, który udało mi się przezwyciężyć podając pełną ścieżkę do obrazu, jak w C: \ Folder1 \ Folder2 \ filename.ext


Jaki „ten sam błąd 215”? Nigdzie w pytaniu PO nie wspomniano o żadnym błędzie. Również OP używa pełnej ścieżki do obrazu, więc nie widzę, jak to odpowiada na pytanie.
Max Vollmer
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.