Функция cv2.imshow() открывает окно, которое всегда говорит, что не отвечает - python opencv
Я пытаюсь запустить очень простую программу. Открыть и jpg файл и отобразить его с помощью opencv-библиотеки для python. Первоначально все работало нормально, но теперь оно просто открывает окно, которое не показывает изображение, но говорит "не отвечает". Мне нужно зайти в диспетчер задач и закрыть его!
from numpy import *
import matplotlib as plt
import cv2
img = cv2.imread('amandapeet.jpg')
print img.shape
cv2.imshow('Amanda', img)
Ответы
Ответ 1
Вы пропустили еще одну строку:
cv2.waitKey(0)
Затем окно отображает изображение, пока вы не нажмете любую клавишу на клавиатуре. Или вы можете передать следующее:
cv2.waitKey(1000)
cv2.destroyAllWindows()
Здесь окно показывает изображение за 1000 мс или 1 секунду. После этого окно исчезнет. Но в некоторых случаях это не так. Поэтому вы можете насильно уничтожить его, используя cv2.destroyAllWindows()
Сначала прочитайте больше руководств: http://docs.opencv.org/trunk/doc/py_tutorials/py_tutorials.html
Ответ 2
Ни один из ответов здесь не работал в MacOS. Следующие работы:
Просто добавьте cv2.waitKey(1)
после cv2.destroyAllWindows()
.
Пример:
import cv2
image = cv2.imread('my_image.jpg')
cv2.imshow('HSV image', hsv_image); cv2.waitKey(0); cv2.destroyAllWindows(); cv2.waitKey(1)
Ответ 3
Недавно я работал с opencv 3.2 и matplotlib и обнаружил (через пробную версию и ошибку комментариев строки), что импорт pyplot из matplotlib имеет какое-то вмешательство в функцию cv2.imshow(). Я не уверен, почему и как это работает, но если кто-то ищет эту проблему и сталкивается с этим старым форумом, это может помочь. Я пытаюсь найти решение вокруг этого интервала bu
Ответ 4
Если вы использовали записные книжки python, тогда существует проблема с использованием cv2.waitKey(0) и cv2.destroyallwindows() в системе на основе Unix для запуска программы opencv.
У меня есть альтернативный метод, который предотвратил бы замораживание вашего изображения
Шаги: -Создайте код из ноутбуков python и создайте новый файл filename.py и вставьте его
- Открытый терминал
- cd path/to/file
- источник активирует VirtualEnvironment
- python filename.py
Это приведет к запуску кода непосредственно из терминала. Надеюсь, это поможет вам. Пример ссылки: https://youtu.be/8O-FW4Wm10s
Ответ 5
Я тоже столкнулся с той же проблемой. Я бегу через командную строку Python в CENTOS 7 со следующим кодом
>> import cv2, numpy as np
>> cap=cv2.VideoCapture(0)
>> img=cap.read()
>> cap.release()
>> cv2.imshow('image',img[1])
>> cv2.waitKey(0)
>> cv2.destroyAllWindows()
>> cv2.waitKey(1)
Даже тогда проблема сохранялась и не решалась. Итак, я добавил
>> cv2.imshow('image',img[1])
Добавление этого закрыло окно изображения. При повторном запуске команда создаст новый экземпляр. Надеюсь, вы можете попробовать, если у вас все еще есть какие-либо проблемы.
Ответ 6
Функция cv2.imshow() всегда использует еще две функции для загрузки и закрытия изображения. Этими двумя функциями являются cv2.waitKey() и cv2.destroyAllWindows(). Внутри функции cv2.waitKey() вы можете указать любое значение, чтобы закрыть изображение и продолжить дальнейшие строки кода.
# First line will provide resizing ability to the window
cv.namedWindow('Amanda', cv.WINDOW_AUTOSIZE)
# Show the image, note that the name of the output window must be same
cv.imshow('Amanda', img)
# T0 load and hold the image
cv.waitKey(0)
# To close the window after the required kill value was provided
cv.destroyAllWindows()
Надеемся, что вы получите изображение в отдельном окне.
Ответ 7
У меня была такая же ошибка, пока я не добавил следующие строки кода. Для waitKey вы можете ввести цифры выше 0 (т.е. 1, 100 и выше). Он служит временем задержки для окна и составляет миллисекунды.
→ cv2 waitKey (0)
→ cv2 destroyAllWindows()
Ответ 8
Решение, которое сработало для меня:
Переключите графику inline на автоматически. Он работал как в Spyder, так и в ноутбуках Jupyter.
Некоторые предыстории для моего случая (для тех, кто может быть быстро судить):
Раньше он работал нормально: я мог открыть изображение, оно загрузилось бы, и оно было бы отзывчивым (не говорит "Не отвечает", может закрыться, сфокусироваться и т.д.) Затем я установил несколько пакетов и запустил несколько демонстрационных тетрадей, которые, по-видимому, испортил некоторые настройки (также были сброшены открытые файлы Spyder).
Я попытался добавить waitKey (1) (и значения 0, 30, 1000 и т.д.). Это заставило изображение загружаться, по крайней мере. Но рамка изображения была "Не отвечает": не обновлялась, не закрывалась, не поднималась и т.д. Пришлось закрывать с помощью cv2.destroyAllWindows().
Обратите внимание, что все работало нормально во время waitKey. Я поместил это в цикл, который показывает одно и то же изображение в окне с тем же именем и ждет несколько секунд. Во время цикла все работает отлично. Как только цикл заканчивается, окно изображения "не отвечает" (что похоже на проблему с потоком GUI). Я попытался использовать cv2.startWindowThread(), и ничего не изменилось.
Наконец, переход с Inline-графики на Auto привел все в порядок.