Python OpenCV - waitKey (0) не отвечает?
Я использую OpenCV 2.4.7 на Ubuntu 12.04. Я программирую на python и у меня возникает проблема при запуске этого скрипта:
import cv2
img = cv2.imread('347620923614738322_233985812.jpg')
cv2.namedWindow("window")
cv2.imshow("window", img)
cv2.waitKey(0)
Проблема в том, что скрипт не останавливается, когда я закрываю изображение. Я искал информацию о waitKey
и обнаружил, что использование cv2.waitKey(0)
является правильным.
Я не понимаю, в чем проблема?
Ответы
Ответ 1
Этот код работает для меня с IDLE:
# -*- coding: utf-8 -*-
# Objectif : découvrir le fonctionnement d'opencv-python
# http://opencv-python-tutroals.readthedocs.org/en/latest/index.html
import numpy as np
import cv2
# Load an color image in grayscale
img = cv2.imread('Lena.tiff',0)
WINDOW_NAME = 'Image de Lena'
cv2.namedWindow(WINDOW_NAME, cv2.CV_WINDOW_AUTOSIZE)
cv2.startWindowThread()
# Display an image
cv2.imshow(WINDOW_NAME,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Надеюсь, это поможет будущим читателям.
Ответ 2
Я обнаружил, что он работает, если я нажимаю клавишу, пока окно находится в фокусе. Если командная строка находится в фокусе, ничего не происходит
Ответ 3
Добавление cv2.waitKey(1) после уничтожения окна должно работать в этом случае.
cv2.imshow('imgae',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)
Ответ 4
Попробуйте выполнить script непосредственно из терминала работает 100% для меня , но не из среды IDE, например, я объясню:
Я использую fedora 20 и получил ту же проблему, копируя первый пример из официального руководства opencv python, я использую:
- Fedora 20 64bit
- IDE Spyder для python
- Python Version 2.7.5
- Fedora 64 бит
- OpenCV 2.4.7
Вот код для теста
import cv2
img = cv2.imread('/path/image1.jpeg',0)
cv2.imshow('Display',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
При запуске этого script с помощью F5 из Spyder он запускает его с помощью встроенного терминала python с этой строкой:
runfile('/home/user/Workspace/test.py', wdir=r'/home/user/Workspace')
В этом случае cv2.waitKey(0) или cv2.waitKey(-1) не работают, и окна остаются открытыми после нажатия клавиш с кодом примера
Попытка закрыть окна приведет к предупреждению "Не реагировать, заставить покинуть"
Но при выполнении script из терминала он работает на 100%
не обнаружил возникновение проблемы, обновится, если найду его.
Ответ 5
Вот минималистичный код для лучшей производительности на всех платформах:
import cv2
img = cv2.imread("image.jpg")
cv2.imshow("Window", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
А теперь несколько замечаний:
Когда пользователь хочет закрыть окно нажатием клавиши 0
, он/она должен убедиться, что клавиша 0
нажата, пока окно находится в фокусе. Потому что, как указано выше, если терминал находится в фокусе, ничего не происходит, и выполнение кода застревает в cv2.waitKey(0)
пока клавиша 0
будет нажата должным образом, пока окно находится в фокусе.
Нажатие клавиши 0
когда окно находится в фокусе, является правильным способом закрыть окно и убедиться, что, как только окно уничтожено в строке cv2.destroyAllWindows()
и программа заканчивается, пользователь может вернуть управление терминалом.,
Если окно закрывается щелчком мыши, оно будет уничтожено, но пользователь окажется в ситуации, когда ему не удастся вернуть контроль над терминалом. В такой ситуации пользователь может захотеть закрыть не отвечающий терминал и открыть новый.
Ответ 6
нажмите на окно изображения (активно), а затем нажмите и клавишу, не пишите в окне терминала.
Ответ 7
cv2.waitKey(0) означает, что script находится в бесконечном цикле с 0 милисекундными ожиданиями после цикла
. только указанный ключ может остановить его.
вы не указали условие конца приложения.
Попробуйте этот код:
Использование других ключей для функции waitKey() opencv
Ответ 8
Существует проблема с системой на основе unix, работающей с opencv-программами из ноутбуков python.
Проверьте этот альтернативный метод. Мое предложение - запустить код в python в терминале. Вы не столкнетесь с какой-либо проблемой.
Скопируйте тот же код и сохраните с помощью файла filename.py
import cv2
input = cv2.imread('path_to_image.png')
cv2.imshow('Hello World', input)
cv2.waitKey(0)
cv2.destroyAllWindows()
затем откройте конкретный каталог, а затем откройте терминал
Шаги:
Open Terminal
cd path/to/filename.py
source activate YOURPROFILE
python filename.py
Это решит проблему
https://youtu.be/8O-FW4Wm10s
Ответ 9
Решено в Spyder под Ubuntu, выполнив [Выполнить] → [Конфигурация для файла] → [Выполнить во внешнем системном терминале].
Ответ 10
Это будет работать, даже если вы закроете окно с помощью крестовой кнопки на окне.
import numpy as np
import cv2
img = cv2.imread('arvid.jpg', 0)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', img)
while True:
k = cv2.waitKey(30) & 0xFF
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
cv2.imwrite('arvid2.jpg', img)
cv2.destroyAllWindows()
if cv2.getWindowProperty("image", 0) == -1:
break