OpenCV Python: как определить, закрыто ли окно?

У меня есть следующий код:

total_frames = 50 cv2.cv.NamedWindow("Dragonfly Simulation") cv2.cv.StartWindowThread() for i in range(total_frames): # do stuff img_name = # something img = cv2.cv.LoadImage(img_name) cv2.cv.ShowImage("Dragonfly Simulation", img) cv2.cv.WaitKey(2) cv2.cv.DestroyWindow("Dragonfly Simulation") cv2.cv.WaitKey(1) # rest of code 

Итак, что он делает:

  1. Открывает окно
  2. В цикле отображается изображение в окне
  3. Закончив, закроет окно
  4. Запускает остальную часть кода

Однако в этом случае у меня есть total_frame данный ранее. Я не хочу этого.

Вместо этого мне нужен код, который выполняет следующие действия:

  1. Открывает окно
  2. В цикле отображается изображение в окне
  3. Ожидает, что пользователь закроет это окно
  4. Когда пользователь закрывает это окно, цикл выхода, продолжается с остальной частью кода.

Однако я не могу найти функцию в OpenCV, которая может обнаружить, когда пользователь закрывает окно. Может ли кто-нибудь предложить обходной путь?

3 Solutions collect form web for “OpenCV Python: как определить, закрыто ли окно?”

Я просто искал способ обнаружить, когда окно было закрыто с помощью кнопки X окна в дополнение к ожиданию нажатия клавиши, но я не мог найти ответ нигде ( IsWindowVisible и cvGetWindowHandle недоступны в Python cv2 ).

Поэтому я играл, и вот как это работает:

 while cv2.getWindowProperty('window-name', 0) >= 0: keyCode = cv2.waitKey(50) # ... 

cv2.getWindowProperty() возвращает -1 как только окно закрывается.


Для пояснения см. Документацию для перечисления cv::WindowPropertyFlags : получение флага с индексом 0 является полноэкранным свойством, но на самом деле не имеет значения, какой флаг использовать, все они становятся -1 как только окно закрывается ,

 import cv2 import numpy as np # total_frames = 50 cv2.namedWindow("Dragonfly Simulation") cv2.startWindowThread() # for i in range(total_frames): while True: # do stuff img = np.random.randint(0,255,(200,300)).astype(np.uint8) cv2.imshow("Dragonfly Simulation", img) key = cv2.waitKey(200) print key if key in [ord('a'), 1048673]: print 'a pressed!' elif key in [27, 1048603]: # ESC key to abort, close window cv2.destroyAllWindows() break # do the rest of processing after break print 'results:' 

Конечно, вы можете проверить пользовательские входы, используя waitKey и вот небольшой пример, основанный на вашем коде. Я изменил старый cv-интерфейс на cv2. Я думаю, что cv устарел.

(Edit) Я переместил cv2.destroyAllWindows () внутрь цикла while, чтобы было ясно, что окно закрывается, когда пользователь нажал клавишу ESC (которую вы можете назначить по вашему выбору). Я не думаю, что opencv имеет надлежащий обработчик событий, чтобы поймать событие закрытия окна, как в других инструментах GUI (wxPython и т. Д.). Поэтому вам нужно будет определить, как ваши пользователи должны закрыть окно и следить за этим.

Начиная с версии 2.2 существует простое решение (это изменено из цикла в hist.py):

  cv2.imshow('image',im) while True: k = cv2.waitKey(100) # change the value from the original 0 (wait forever) to something appropriate ... elif k == 27: print('ESC') cv2.destroyAllWindows() break if cv2.getWindowProperty('image',cv2.WND_PROP_VISIBLE) < 1: break cv2.destroyAllWindows() 
Interesting Posts

Обрабатывать список или одно целое в качестве аргумента

Есть ли у python методы, подобные __setattr__, но для класса python?

Предоставление настраиваемых тегов шаблонов из базы данных в Django

PyQt правильное использование emit () и pyqtSignal ()

Распространение пакета python вместе с зависимостями модулей с использованием RPM

Избегание вложенных циклов

Использование isdigit для поплавков?

Удаление веб-страницы aspx с помощью Python с помощью BeautifulSoup

Приложение для веб-приложений для бутылок, не обслуживающее статические файлы css

Захват высокой многоколоничности в статистических моделях

Установка значения по умолчанию для ввода функции для равного другого входа в Python

Получить список из String Python

Коды сущности HTML для текста

Python – Как изменить цвет текста автообновления на белый в круговой диаграмме?

Как запустить подпроцесс в фоновом режиме python

Python - лучший язык программирования в мире.