Команда cv2.imshow не работает должным образом в opencv-python


112

Я использую opencv 2.4.2, python 2.7 Следующий простой код создает окно с правильным именем, но его содержимое просто пустое и не показывает изображение:

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

кто-нибудь знает об этой проблеме?


Ваш путь к файлу может быть неправильным. Windows использует \ not /. Я не уверен, поддерживает ли OpenCV / в Windows? Если это не поможет, убедитесь, что ваше изображение находится в правильном месте и является действительным.
fmw42

Ответы:


228

imshow()работает только с waitKey():

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

(Здесь скрыт весь цикл сообщений, необходимый для обновления окна.)


3
check print imgпечатает правильный массив numpy, а не NoneTypeобъект.
Абид Рахман К.

7
Чтобы было ясно для потомков, при нормальных обстоятельствах это был бы правильный ответ. Отсутствие waitKey (обычно) приводит к точно такому же поведению, как описано в вопросе.
Snesticle

45

Я нашел ответ, который сработал для меня здесь: http://txt.arboreus.com/2012/07/11/highgui-opencv-window-from-ipython.html

Если вы запускаете интерактивный сеанс ipython и хотите использовать окна highgui, сначала выполните cv2.startWindowThread ().

Подробно: HighGUI - это упрощенный интерфейс для отображения изображений и видео из кода OpenCV. Это должно быть так просто:

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

7
Вы можете закрыть его позже с помощью cv2.destroyAllWindows ()
Zuza

Для QT-реализации highgui startWindowThread () ничего не делает. github.com/opencv/opencv/blob/…
kusi

24

Вы должны использовать cv2.waitKey(0)после cv2.imshow("window",img). Только тогда это сработает.

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

Я бы добавил, что вам может потребоваться установить IDE python для отображения изображения, и вам также следует искать окно, которое иногда не отображает его спереди. Скобка в cv2.waitKey (), как я полагаю, находится в миллисекундах, и если вы оставите поле пустым, изображение будет отображаться навсегда.
Ахмадия

11

Если вы работаете в консоли Python, сделайте следующее:

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

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

Затем, если вы нажмете Enterна изображение, оно успешно закроет изображение, и вы сможете продолжить выполнение других команд.


7

Я столкнулся с той же проблемой. Я попытался прочитать изображение из IDLE и попытался отобразить его с помощью cv2.imshow(), но окно дисплея зависает и показывает, pythonw.exeчто не отвечает при попытке закрыть окно.

В сообщении ниже дается возможное объяснение того, почему это происходит.

pythonw.exe не отвечает

" В принципе, не делайте этого из IDLE. Напишите сценарий и запустите его из оболочки или сценарий напрямую, если он находится в Windows, назвав его с расширением .pyw и дважды щелкнув по нему. Очевидно, существует конфликт между собственным событием IDLE. цикл и те, что из наборов инструментов GUI ".

Когда я использовал imshow()сценарий и выполнял его, а не запускал его непосредственно через IDLE, он работал.


Пожалуйста, добавьте объяснение, предоставленное по ссылке (по крайней мере, как минимум), потому что ссылки могут
устареть

Удар, потому что это проблема, которая у меня есть, но ... «не делай этого» - это не тот ответ, который я ищу =)
Эрик



3

У вас есть все необходимые части где-то в этой ветке:

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

у меня отлично работает в IDLE.


3

Если у вас это не работает, вам лучше поставить

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

в один файл и запустите его.


1

Не требует дополнительных методов после waitKey(0)(ответ на приведенный выше код)

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

Появится окно -> Щелкните по окну и нажмите Enter. Окно закроется.


1

Способ 1:

Следующий код работал у меня. Простое добавление destroyAllWindows () не закрыло окно. Добавление еще одного cv2.waitKey (1) в конце сделало свою работу.

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

кредит: https://stackoverflow.com/a/50091712/8109630

Примечание для новичков:

  • Это откроет изображение в отдельном окне, а не в блокноте. Вот почему мы должны использовать destroyAllWindows (), чтобы закрыть его позже.
  • Поэтому, если вы не видите всплывающее отдельное окно, проверьте, не находится ли оно за вашим текущим окном.
  • После просмотра изображения нажмите клавишу, чтобы закрыть всплывающее окно.

Способ 2:

Если вы хотите отобразить в блокноте 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

Если вы решили использовать «cv2.waitKey (0)», убедитесь, что вы написали «cv2.waitKey (0)» вместо «cv2.waitkey (0)», потому что эта строчная буква «k» также может заморозить вашу программу. .


3
Метод с ключом в нижнем регистре не существует в API. Код выдаст ошибку, поскольку метод не существует.
rayryeng

0

У меня тоже была ошибка -215. Я думал, что проблема в imshow, но когда я изменил imread на чтение в несуществующем файле, я не получил там ошибки. Поэтому я поместил файл изображения в рабочую папку и добавил cv2.waitKey (0), и это сработало.


-1

ошибка: (-215) size.width> 0 && size.height> 0 в функции imshow

Эта ошибка возникает из-за того, что изображение не найдено. Так что это не ошибка функции imshow.


Не имеет отношения к этому вопросу.
rayryeng

-1

У меня была та же ошибка 215, которую я смог преодолеть, указав полный путь к изображению, например, C: \ Folder1 \ Folder2 \ filename.ext


Что за "та же ошибка 215"? Нигде в вопросе OP не упоминается какая-либо ошибка. Также OP использует полный путь к изображению, поэтому я не понимаю, как это отвечает на вопрос.
Макс Фоллмер,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.