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