Команда 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)

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

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

Ответы:

228

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

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

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

Berak
источник
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, он работал.

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

У меня сработал waitKey () с номером больше 0

    cv2.waitKey(1)
Рамбод
источник
3

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

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

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

Iamchriskelley
источник
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), и это сработало.

CirculationDept
источник
-1

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

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

Альваро Фернандес
источник
Не имеет отношения к этому вопросу.
rayryeng
-1

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

пользователь3458364
источник
Что за "та же ошибка 215"? Нигде в вопросе OP не упоминается какая-либо ошибка. Также OP использует полный путь к изображению, поэтому я не понимаю, как это отвечает на вопрос.
Макс Фоллмер,