Функция 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: Перейдите в Инструменты> Настройки> Консоль IPhyton> Графика> Бэкэнд: Автоматически (Измените внутренний интерфейс со встроенного на автоматический)
  • Чтобы изменить настройки ноутбука: Введите команду:

    % matplotlib auto


Некоторые предыстории для моего случая (для тех, кто может быть быстро судить):

Раньше он работал нормально: я мог открыть изображение, оно загрузилось бы, и оно было бы отзывчивым (не говорит "Не отвечает", может закрыться, сфокусироваться и т.д.) Затем я установил несколько пакетов и запустил несколько демонстрационных тетрадей, которые, по-видимому, испортил некоторые настройки (также были сброшены открытые файлы Spyder).

Я попытался добавить waitKey (1) (и значения 0, 30, 1000 и т.д.). Это заставило изображение загружаться, по крайней мере. Но рамка изображения была "Не отвечает": не обновлялась, не закрывалась, не поднималась и т.д. Пришлось закрывать с помощью cv2.destroyAllWindows().

Обратите внимание, что все работало нормально во время waitKey. Я поместил это в цикл, который показывает одно и то же изображение в окне с тем же именем и ждет несколько секунд. Во время цикла все работает отлично. Как только цикл заканчивается, окно изображения "не отвечает" (что похоже на проблему с потоком GUI). Я попытался использовать cv2.startWindowThread(), и ничего не изменилось.

Наконец, переход с Inline-графики на Auto привел все в порядок.