Python opencv close all windows

Closing video window using close “X” button in OpenCV, Python

I am displaying live video from a camera using OpenCV in Python. This is the code:

Now, I can only close my video window by pressing «esc», but nothing happens when I click on my window’s close «X» button. Is there a way to make that work?

3 Answers 3

OpenCV does not have this feature, and only handles key presses by default.

If you want to do this, you must use the handle of the window manager that creates your windows (GTK, QT, . ).

With the cv2 Python module there is a way to do that, I posted the solution here:

This post is just for reference so anyone looking for it can find it

I had this same issue and I found an easy way to do it:

You can use cv2.getWindowProperty(windowName, cv2.WND_PROP_VISIBLE) to check if the current window is visible, and if it’s not you can destroy the window. The method returns a 1 if it is visible and 0 if it is not. Below is an implementation:

The accepted answer links to a solution that will never work as 0 is included in >=0, and uses the wrong second argument in cv2.getWindowProperty() , while the issues only gets indirectly solved later in the thread. I’m adding this as an answer as I could not find the correct solution when I first visited this thread, and this was exactly what I needed and used.

OpenCV Python: How to detect if a window is closed?

I have the following code:

So what does it do:

  1. Opens a window
  2. In a loop, shows an image on the window
  3. Once finished, closes the window
  4. Runs the rest of the code

However in this case I have the total_frame given before. I don’t want that.

Instead, I want a code that does the following:

  1. Opens a window
  2. In a loop, shows an image on the window
  3. Waits for the user to close that window
  4. When the user closes that window, exit loop, goes on with the rest of the code.

However, I cannot find a function in OpenCV that can detect when user closes a window. Can anyone suggest a workaround please?

6 Answers 6

I was just looking for a way to detect when the window has been closed using the X button of the window in addition to waiting for a key press, but I couldn’t find an answer anywhere ( IsWindowVisible and cvGetWindowHandle are not available in the Python cv2 module).

So I played around and this is how it works:

cv2.getWindowProperty() returns -1 as soon as the window is closed.

For explanation, see the documentation for the enumeration of cv::WindowPropertyFlags : getting the flag with index 0 is the fullscreen property, but actually it doesn’t matter which flag to use, they all become -1 as soon as the window is closed.

DestroyWindow does not close window on Mac using Python and OpenCV

My program generates a series of windows using the following code:

I press «q» within the gui window to close it. However, the code continues to the next call of the display function and displays a second gui window while not closing the first. I’m using a Mac with OpenCV 2.1, running the program in Terminal. How can I close the gui windows? Thanks.

12 Answers 12

There are a few peculiarities with the GUI in OpenCV. The destroyImage call fails to close a window (atleast under Linux, where the default backend was Gtk+ until 2.1.0) unless waitKey was called to pump the events. Adding a waitKey(1) call right after destroyWindow may work.

Читайте также:  Бизнес пак под linux

Even so, closing is not guaranteed; the the waitKey function is only intercepted if a window has focus, and so if the window didn’t have focus at the time you invoked destroyWindow , chances are it’ll stay visible till the next destroyWindow call.

I’m assuming this is a behaviour that stems from Gtk+; the function didn’t give me any trouble when I used it under Windows.

You need to run cv.startWindowThread() after opening the window. I had the same issue and now this works for me.

Hope this helps for future readers. And there is also a cv2 binding (I advise to use that instead of cv ).

This code works for me:

The same issue happens with the C++ version, on Linux: Trying to close OpenCV window has no effect

I tried your solution and it worked for me — thanks! I did some trial and error and discovered that looping 4 times did the trick for me. or posting the same code 4 times just the same..

Further, I drilled down to:

or simply calling DestroyAllWindows and then looping the waitKey() code 4 times:

Worked as well. I am not savvy enough to know why this works exactly, though I assume it has something to do with the interruption and delay created by looping that code(?)

Matthäus Brandl said, above, that the third waitKey() worked for him, so perhaps it is slightly different on each system? (I am running Linux Mint with 3.16.1 kernel and python 2.7)

The delay, alone, doesn’t explain it, as simply increasing the delay time on the waitKey() does not do the trick. (Also looped print(«Hello») 1000 times instead of using wiatKey() just to see if the delay that created helped any — it did not.) Must have something more to do with how waitKey() interacts with window events.

OpenCV Docs say: «This function is the only method in HighGUI that can fetch and handle events, so it needs to be called periodically for normal event processing unless HighGUI is used within an environment that takes care of event processing.»

Perhaps it creates an interrupt of sorts in the GUI display that allows the destroyAllWindows() action to process?

Введение в OpenCV — библиотеку компьютерного зрения на Python

Введение

В этом руководстве мы изучим, как использовать библиотеку OpenCV в Python.

OpenCV — это библиотека с открытым кодом, поддерживающая множество платформ, включая Windows, MacOs и Linux. Также эта библиотека существует и для многих языков программирования. Но наиболее часто она используется для написания приложений машинного обучения на языке Python, особенно в сфере компьютерного зрения.

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

В этой статье мы научим вас устанавливать библиотеку OpenСV на платформы Windows, MacOS и Linux. Также мы расскажем про операции с изображениями, арифметику изображений, сглаживание изображений и геометрические трансформации изображений при помощи библиотеки OpenCV. Приступим!

Установка библиотеки

Замечание: так как мы рассматриваем использование библиотеки OpenСV для языка Python, то неявно подразумевается, что сам Python ( версии 3) у вас уже установлен. Для установки библиотеки OpenCV выполните одну из следующих команд, в зависимости от вашей операционной системы.

Windows

$ pip install opencv-python

MacOS

$ brew install opencv3 —with-contrib —with-python3

Linux

$ sudo apt-get install libopencv-dev python-opencv

Для проверки результата установки просто введите в терминале Python следующую команду:

Читайте также:  Вирусы для ос мака

Если не появилось сообщение об ошибке, значит библиотека была установлена успешно.

Основные операции с изображениями

Установив OpenCV, давайте теперь, так сказать, пощупаем основные функциональные возможности данной библиотеки.

Вывод изображения на экран

Процесс вывода изображения на экран состоит из двух шагов. Сначала мы должны загрузить изображение, а после этого вывести его на экран. Эти операции выполняются последовательно, и для каждой из них предназначена отдельная функция.

Для вывода изображения на экран нам необходимо задать две вещи:

  1. Путь к файлу, в котором содержится изображение (подойдет как относительный, так и абсолютный путь).
  2. Режим чтения файла (только чтение, запись, и т.д.).

Функция, при помощи которой мы считываем изображение, называется cv2.imread() . У нее есть три режима работы. Первый — это IMREAD_GRAYSCALE . Как видно из названия, он преобразует изображение в черно-белое с оттенками серого. Второй — IMREAD_UNCHANGED , он загружает изображение без обрезания альфа-канала. И третий, используемый по умолчанию, — IMREAD_COLOR . Он просто загружает цветное изображение, используя RGB-каналы.

Вот пример кода:

Таким образом мы загружаем изображение велосипеда из файла bike.png и сохраняем его в переменную my_bike для дальнейшей работы.

Замечание: если в результате выполнения данного кода возникла ошибка, есть только три возможных причины для этого. Первая — вы неправильно задали путь к файлу. Вторая — такого файла просто не существует, и третья — тип изображения (jpg/jpeg/png) задан неверно.

Теперь давайте выведем на экран только что загруженное изображение. Для этого используется функция cv2.imshow() . Если вы пользовались Matlab, ее работа должны быть вам знакома.

Первый параметр функции imshow() — это строка, которую мы хотим использовать в качестве заголовка к нашему изображению. Второй параметр — это переменная, содержащая загруженное нами изображение.

Сохранение изображений

Для сохранения результатов нашей работы с изображениями в библиотеке OpenCV существует функция cv2.imwrite() .

Вот пример ее использования:

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

Арифметика изображений

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

Из всего множества возможных операций мы рассмотрим только два примера, которые помогут нам понять концепцию арифметических операций в библиотеке OpenСV. В качестве первого примера мы возьмем сложение двух изображений, а в качестве второго — их смешение (blending).

Давайте рассмотрим код этих примеров.

Сложение изображений

Команда waitkey используется для остановки выполнения кода до нажатия любой кнопки клавиатуры. Это весьма удобно, так как в противном случае выведенное на экран изображение только на долю секунды мелькнуло бы на экране, а затем программа завершила бы свое исполнение.

Смешение изображений

Смешение изображений весьма похоже на их сложение, за исключением того, что теперь мы можем контролировать вклад каждого из входящих изображений в результирующее. В общем случае, если мы хотим, чтобы одно из входящих изображений было более контрастным, а другое более размытым при их слиянии, мы должны вместо сложения изображений использовать их смешение.

Чтобы прояснить это, давайте рассмотрим код:

Сумма весов, передающихся в функцию cv2.addWeighted() , должна быть равна 1 . Также в конце в функцию можно передать скалярную величину, которая будет добавлена к значению каждого пикселя результирующего изображения.

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

Сглаживание изображений

Сглаживание изображений является крайне полезной операцией и очень часто используется перед тем как передать картинку для обработки в модель машинного обучения. В основном это нужно делать для фильтрации высокочастотных шумов, применяя для этого низкочастотный фильтр. Существует множество различных фильтров, например усредняющий фильтр (box filter), медианный фильтр (median filter), фильтр типов волн (модовый фильтр, mode filter), фильтр Гаусса (Gaussian filter) и многие другие. Но для понимания сглаживания изображений и его применения в библиотеке OpenCV, мы рассмотрим только первый, усредняющий фильтр (box filter).

Читайте также:  Графічна операційна система windows

Допустим, у вас есть изображение размером 10X10 и вы хотите его пропустить через усредняющий фильтр размером 3Х3. Как вы будете действовать?

Мы начнем с крайнего левого угла нашего изображения, поместим туда фильтр размером 3Х3 и заменим центральный элемент на среднее по всем девяти элементам (сумма элементов, попавших в фильтр, деленная на 9). Это будет только первым этапом. Далее мы сдвинем фильтр на один шаг вправо и повторим эту процедуру. Ниже этот пример наглядно проиллюстрирован.

Фильтр или маска:

Применение фильтра к изображению размером 10Х10:

Давайте теперь посмотрим, как можно организовать фильтрацию изображения при помощи библиотеки OpenCV. Пожалуйста, внимательно прочитайте все комментарии к каждой строчке данного кода.

Чтобы увидеть результат на экране, выполните следующий вспомогательный код:

Преобразование изображений

Последней, но одной из самых важных тем, поднятых нами в данном обзоре библиотеки OpenCV, является преобразование изображений. Эта тема находит применение в самых разных приложениях, но отдельно следует упомянуть задачу аугментации данных для моделей машинного обучения. Речь идет о ситуациях, когда в нашем датасете для полноценного обучения недостаточно данных, и мы, дополняя и видоизменяя существующие картинки, увеличиваем первоначальный датасет до нужного размера. Это помогает нам серьезно увеличить точность работы обучаемой модели.

Список возможных преобразований весьма велик и включает в себя масштабирование, афинное преобразование изображений, вращение, транспонирование и многое другое. Мы кратко расскажем только про масштабирование и вращение, но в библиотеке OpenСV есть поддержка всех возможных преобразований. Начнем с масштабирования.

Масштабирование

Попросту говоря, масштабирование — это не что иное как изменение размеров изображения, его увеличение либо уменьшение. В библиотеке OpenCV для этого существует функция resize. У этой функции, в свою очередь, есть три метода: INTER_CUBIC , INTER_LINEAR и INTER_AREA . Давайте на примере конкретного кода разберем, как это все работает. Пожалуйста, внимательно изучите код, комментарии к нему и описание ниже.

Здесь в функции resize параметр fx определяет масштаб изменений по ширине, fy — по высоте, а параметр interpolation отвечает за сам способ изменений (то есть расширение или сжатие).

Вращение

Вращение позволяет нам перемещать изображение вокруг определенной оси на заданный угол.

Перед тем как мы научимся вращать наши изображения при помощи библиотеки OpenСV, давайте вспомним, что существует линейный оператор под названием матрица поворота, который как раз и осуществляет преобразования такого рода. Мы не будем вдаваться в математические детали, так как в библиотеке OpenCV эта матрица вычисляется при помощи одного вызова функции. Вы это увидите в следующем коде:

В функции getRotationMatrix2D 180 — это угол, на который наше изображение должно быть повернуто, 1 — это масштабный коэффициент. Данная функция возвращает матрицу поворота, которая записывается в переменную matrix .

Далее функция warpAffine , используя вычисленную на предыдущем шаге матрицу поворота, поворачивает наше изображение в соответствии с заданной спецификацией.

Выводы

Подводя итоги, давайте еще раз пройдемся по наиболее важным местам в нашей статье. Библиотека OpenCV доступна на многих языках и часто используется вместе с библиотеками NumPy, SciPy и Matplotlib, как мы могли заметить в приведенных примерах. Некоторые функции библиотеки взяты из Matlab и также поддерживают векторные вычисления, что сильно повышает вычислительную эффективность.

Кроме того, OpenCV является одной из лучших библиотек для компьютерного зрения, и после прочтения этой статьи вы сможете найти много приложений машинного обучения, которые были разработаны с использованием OpenCV.

Также надо сказать, что данная статья приоткрывает лишь самую малость того, что есть в библиотеке OpenСV. Ее прочтение должно вдохновить вас еще глубже погрузиться в изучение этой библиотеки и узнать о многих других продвинутых функциях в ней.

Оцените статью