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, которая может обнаружить, когда пользователь закрывает окно. Может ли кто-нибудь предложить обходной путь?

  • Как удалить расширение на blob, вызванное морфологией
  • Извлечь корову из изображения
  • проблема совместимости с контуром в openCV 3
  • Случайный лес не работает в opencv python (cv2)
  • Как просматривать видеопоток в OpenCV2 python
  • Python OpenCV конвертирует изображение в байтовую строку?
  • python-opencv AttributeError: объект 'module' не имеет атрибута 'createBackgroundSubtractorGMG'
  • Оперковская гомография, чтобы найти глобальные координаты xy из координат пикселя xy
  • 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() 
    Python - лучший язык программирования в мире.