DestroyWindow не закрывает окно на Mac с помощью Python и OpenCV

Моя программа создает серию окон, используя следующий код:

def display(img, name, fun): global clicked cv.NamedWindow(name, 1) cv.ShowImage(name, img) cv.SetMouseCallback(name, fun, img) while cv.WaitKey(33) == -1: if clicked == 1: clicked = 0 cv.ShowImage(name, img) cv.DestroyWindow(name) 

Я нажимаю «q» в окне gui, чтобы закрыть его. Однако код продолжает следующий вызов функции отображения и отображает второе окно gui, не закрывая первое. Я использую Mac с OpenCV 2.1, запуская программу в терминале. Как закрыть окна gui? Благодарю.

9 Solutions collect form web for “DestroyWindow не закрывает окно на Mac с помощью Python и OpenCV”

В графическом интерфейсе OpenCV есть несколько особенностей. В вызове DestroyImage не удается закрыть окно (по крайней мере, под Linux, где WaitKey по умолчанию был Gtk + до 2.1.0), если WaitKey был вызван для перекачки событий. Добавление WaitKey(1) сразу после DestroyWindow может работать.

Тем не менее, закрытие не гарантируется; функция WaitKey перехвачена только в том случае, если окно имеет фокус, и поэтому, если в окне не было фокуса во время вызова DestroyWindow , скорее всего, он останется видимым до следующего вызова DestroyWindow .

Я предполагаю, что это поведение, которое происходит от Gtk +; функция не вызывала у меня проблем, когда я использовал ее под Windows.

После открытия окна вам нужно запустить cv.StartWindowThread() . У меня была такая же проблема, и теперь это работает для меня.

Надеюсь, это поможет будущим читателям. И есть также привязка cv2 (я советую использовать это вместо cv ).

Этот код работает для меня:

 import cv2 as cv import time WINDOW_NAME = "win" image = cv.imread("ela.jpg", cv.CV_LOAD_IMAGE_COLOR) cv.namedWindow(WINDOW_NAME, cv.CV_WINDOW_AUTOSIZE) initialtime = time.time() cv.startWindowThread() while (time.time() - initialtime < 5): print "in first while" cv.imshow(WINDOW_NAME, image) cv.waitKey(1000) cv.waitKey(1) cv.destroyAllWindows() cv.waitKey(1) initialtime = time.time() while (time.time() - initialtime < 6): print "in second while" 

Такая же проблема возникает с версией C ++, в Linux: попытка закрыть окно OpenCV не влияет

Sayem2603

Я попробовал ваше решение, и это сработало для меня – спасибо! Я сделал несколько проб и ошибок и обнаружил, что цикл 4 раза сделал трюк для меня … или отправил один и тот же код 4 раза точно так же ..

Кроме того, я развернулся до:

 cv2.destroyAllWindows() cv2.waitKey(1) cv2.waitKey(1) cv2.waitKey(1) cv2.waitKey(1) 

или просто вызывая DestroyAllWindows, а затем циклически повторяя код waitKey () 4 раза:

 cv2.destroyAllWindows() for i in range (1,5): cv2.waitKey(1) 

Работал также. Я недостаточно сообразителен, чтобы понять, почему это работает точно, хотя я полагаю, что это имеет какое-то отношение к прерыванию и задержке, созданным путем циклирования этого кода (?)

Маттеус Брандл сказал выше, что третий waitKey () работал на него, так что, возможно, он немного отличается от каждой системы? (Я запускаю Linux Mint с ядром 3.16.1 и python 2.7)

Задержка сама по себе не объясняет это, так как простое увеличение времени задержки на waitKey () не делает этого трюка. (Также зацикленную печать («Hello») 1000 раз вместо использования wiatKey (), чтобы увидеть, помогла ли какая-либо задержка, которая создала, – это не так.) Должно быть, что-то больше связано с тем, как waitKey () взаимодействует с событиями окна.

В документах OpenCV говорится: «Эта функция является единственным методом в HighGUI, который может извлекать и обрабатывать события, поэтому его необходимо периодически вызывать для нормальной обработки событий, если HighGUI не используется в среде, которая занимается обработкой событий».

Возможно, это создает прерывание сортировки в графическом интерфейсе, который позволяет процессу destroyAllWindows () обрабатывать?

J

Это решение работает для меня (под Ubuntu 12.04 с открытым python в оболочке):

Повторно вызовите cv.ShowImage после того, как окно «уничтожено».

Я решил проблему, вызвав cv2.waitKey (1) в цикле for, я не знаю, почему это сработало, но выполняет мою работу, поэтому я больше не беспокоился о себе.

 for i in range(1,10): cv2.destroyAllWindows() cv2.waitkey(1) 

вы можете объяснить.

Если вы используете Spyder (пакет Anaconda), возникает проблема.

Ни один из решений не работал для меня. Я обнаружил, что проблема заключается не в функциях, а в проблеме Spyder. Попробуйте использовать текстовый редактор плюс, работающий на терминале, и вы можете просто использовать просто:

 WINDOW_NAME = "win" image = cv.imread("foto.jpg", 0) cv.namedWindow(WINDOW_NAME, cv.CV_WINDOW_AUTOSIZE) cv.startWindowThread() cv.imshow(WINDOW_NAME, image) cv.waitKey() cv.destroyAllWindows() 

Прошив эту проблему на консоли python, я заметил следующее поведение:

  • выдача cv2.imshow после того, как cv2.destroyWindow иногда закрывает окно. Хотя старое окно появляется снова со следующим highgui , например, cv2.namedWindow
  • третий вызов cv2.waitKey после того, как cv2.destroyWindow закрыл окно каждый раз, когда я пытался. Кроме того, закрытое окно оставалось закрытым, даже после использования cv2.namedWindow впоследствии

Надеюсь, это поможет кому-то.

(Я использовал Ubuntu 12.10 с python 2.7.3, но OpenCV 2.4.2 из репозиториев 13.04)

После некоторого времени поиска ни один из предоставленных решений не работал для меня, так как в этой функции есть ошибка, и у меня не было времени исправить ее, мне не нужно было использовать окно cv2 для отображения фреймов. После сохранения нескольких кадров вы можете открыть файл в другом средстве просмотра, например VLC или MoviePlayer (для Linux).

Вот как я сделал свое.

  import cv2 threadDie = True # change this to false elsewhere to stop getting the video def getVideo(Message): print Message print "Opening url" video = cv2.VideoCapture("rtsp://username:passwordp@IpAddress:554/axis-media/media.amp") print "Opened url" fourcc = cv2.cv.CV_FOURCC('X','V','I','D') fps = 25.0 # or 30.0 for a better quality stream writer = cv2.VideoWriter('out.avi', fourcc,fps, (640,480),1) i = 0 print "Reading frames " while threadDie: ret, img = video.read() print "frame number: ",i i=i+1 writer.write(img) del(video) print "Finished capturing video" 

Затем откройте файл с помощью другого средства просмотра, возможно, в более узкой функции, например, если вам нравится vlc, вы можете запустить его и передать сохраненный файл в качестве параметра. На терминале я бы сделал это

 vlc out.avi #out.avi is my video file being saved by the function above. 

Это сработало для меня в arch linux.

Вот то, что сработало для меня:

 cv2.namedWindow("image") cv2.imshow('image', img) cv2.waitKey(0) # close window when a key press is detected cv2.destroyWindow('image') cv2.waitKey(1) 
  • Сглаживание краев двоичного изображения
  • Ошибка типа данных с drawContours, если я не соберу
  • Случайный лес не работает в opencv python (cv2)
  • Наиболее похожее распознавание лиц в Python
  • Параметры houghLinesP OpenCV
  • ImportError: Ошибка загрузки DLL:% 1 не является допустимым приложением Win32. Но DLL есть
  • OpenCV 2.4.1 - вычисление дескрипторов SURF в Python
  • Python OpenCV - поиск черных областей в двоичном изображении
  •  
    Interesting Posts for Van-Lav

    Использование изображения с прямоугольником, нарисованным над ним в python

    Сериализация и десериализация элементов группы в Charm-Crypto

    Импорт набора данных SPSS в Python

    Расширение Python C – Почему методы, которые используют аргументы ключевых слов, передаваемые в PyCFunction

    создать разрешения django, ошибка: запрос соответствия ContentType не существует

    Обработка исключенных исключений с помощью Tkinter

    Как извлечь числа (наряду с прилагательными или диапазонами сравнения)

    Как распараллелить вычисление суммы в python numpy?

    Как напечатать строку, за которой следует результат функции в Python

    Открыть файл из диалогового окна файла Windows с помощью python автоматически

    Как правильно выравнивать поле уровня в Python logging.Formatter

    Цитировать Цитировать POSIX shell специальные символы на выходе Python

    Использовать Python на MAMP

    Как истечь сеанс из-за бездействия в Django?

    Как условно вставить элемент в таблицу dynamodb с помощью boto3

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