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) 
  • Как изменить размер изображения с помощью OpenCV2.0 и Python2.6
  • Обнаружение рисованных фигур из блок-схемы OpenCV
  • Библиотека не загружена: @ rpath / libopenblasp-r0.2.19.dylib
  • Получить значение RGB opencv python
  • Не удалось установить cv2 на windows
  • Как записывать видео с помощью OpenCV и Python?
  • OpenCV Объединение SURF с нейронной сетью
  • Ошибка OpenCV: утверждение не выполнено при использовании функции COLOR_BGR2GRAY
  • OpenCV: кадры чтения из VideoCapture продвигают видео в странно неправильное местоположение
  • Поиск области контура OpenCV
  • DrawContours () не работает opencv python
  • Python - лучший язык программирования в мире.