opencv что это такое
OpenCV в Python: Часть 1 — Работа с изображениями и видео
Добро пожаловать! Перед вами первая статья из серии OpenCV в Python, которая, как вы уже догадались по названию, посвящена тому, как научиться комфортно работать в OpenCV.
Я понимаю, что у каждого свой стиль обучения, но я настоятельно рекомендую вам вместе со мной следовать за мыслью и писать код по мере прохождения уроков. Все файлы кода и данных будут доступны в конце каждой статьи. Если у вас будут появляться вопросы, не стесняйтесь их задавать.
Не будем терять времени, начнем!
Начало работы с OpenCV
Поскольку мы начинаем с самого начала, в этом разделе мы поговорим об основах обработки изображений. Чтобы начать работать с OpenCV, надо сначала ее установить. Для этого введите команду в терминале (на Windows):
Как только установка будет завершена, можно начинать писать код.
Для начала давайте импортируем необходимые библиотеки.
Модуль cv2 – это и есть OpenCV. Его мы будем использовать для анализа изображений и видео. Модуль argparse будет полезен при работе с аргументами, передаваемыми через терминал. Если вам неудобно работать с командой строкой, можете почитать это руководство (https://www.pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/), в котором все очень хорошо объясняется.
Работать мы будем с этим изображением.
Разместите это изображение (или любое другое на выбор) в директорию, где находится ваш файл с программой.
В терминале мы передадим это изображение в качестве аргумента, поэтому в файле с исходным кодом нужно сделать парсер аргументов.
Второй аргумент конвертирует изображение в оттенки серого. Этот шаг мы будем часто выполнять при работе с изображениями и видео, потому что обработка цветных изображений намного сложнее и занимает много времени, тогда как зачастую изображений в оттенках серого вполне достаточно для многих задач. Следовательно, нам нет необходимости использовать более сложные и трудные в обработке цветные изображения.
Для отображения изображений используется метод imshow. Первый аргумент – заголовок отображаемого изображения, а второй – сама переменная изображения.
cv2.waitKey(0) будет ждать, пока пользователь не нажмет любую клавишу, после чего окно с изображением закроется.
Помимо вывода самого изображения, эту переменную image можно использовать для отображения некоторой базовой информации, такой как высота и ширина изображения.
Метод imwrite принимает путь к выходному изображению, которое будет сохранено в качестве первого аргумента, и переменную с изображением в качестве второго. Если вы хотите изменить тип файла, просто измените его в имени пути, а OpenCV позаботится об остальном.
А вот и полный код:
Команда для выполнения файла:
Примечание: Я назвал файл с программой app.py, а файл с изображением photo_one.jpeg, не забудьте вставить свои названия.
После выполнения этого файла, вы получите исходное изображение в оттенках серого:
В вашем основном каталоге создастся папка с изображениями, в которой вы увидите то же изображение, что и в файле newimage.png.
Работа с видео в OpenCV
Теперь, когда мы закончили с изображениями, пришло время познакомиться с основами взаимодействия с веб-камерой или видеофайлами в OpenCV. Работа с видео мало чем отличается от работы с изображениями, поскольку видео состоит из кадров, которые по сути являются изображениями.
Для начала импортируем библиотеки.
Число, которое мы передаем, означает источник. 0 – первая веб-камера в вашей системе, 1 – вторая и т.д.
Если вы хотите загрузить уже существующий видеофайл вместо захвата прямой трансляции, просто на место номера вставьте путь к нему.
Функция cap.read() возвращает логическое значение (True/False) и кадр. Если кадр был считан верно, то возвращается True.
cv2.imshow() используется для отображения видео. Название видео будет первым аргументом.
Поскольку мы сделали бесконечный цикл, нам нужно что-то, что его прервет.
Поначалу этот фрагмент кода может показаться странным, но как только вы разберетесь в деталях, станет легче.
В этом сценарии 0xFF – это 8-битный двоичный код 11111111, поскольку для представления символа «q». В результате вы получите целое число меньшее 255.
После того, как мы закончим использовать камеру, ее нужно «освободить». Если мы этого не сделаем, то в следующий раз при попытке ее использовать, вы получите ошибку.
Теперь пришло время запустить файл. На всякий случай, если вы не проследили, приведу весь код этого раздела:
После выполнения файла, вы увидите изображение с веб-камеры в окне под названием «video feed». Чтобы закрыть окно, нажмите «q».
Помните, как мы преобразовали наше цветное изображение в оттенки серого и сохранили его на диске? То же самое можно сделать и с видео. Нужно просто внести несколько незначительных изменений.
В цикл while добавьте следующие инструкции:
После сохранения и выполнения файла вы получите два окна:
Версию в оттенках серого.
Теперь мы можем выводить два или более окон, когда хотим сравнить наши изменения с исходным файлом/потоком. Так проще обнаруживать изменения, которые мы внесли.
Имя выходного файла будет первым аргументом. Затем нужно передать количество кадров в секунду (fps) и размер кадра.
Чтобы сохранить видео, нужно записать каждый кадр в цикле while.
После выполнения этого кода вы заметите, что видео с именем «output.avi» будет присутствовать в вашем главном каталоге. Вот видео, которое мы только что записали и сохранили на диск.
Итоги
В этой статье мы поговорили о самом простейшем – загрузке и записи мультимедийного контента. OpenCV – очень мощный инструмент, который можно использовать для гораздо более высокоуровневых работ.
На данный момент, я надеюсь, что вам стало гораздо удобнее работать с OpenCV. На самом деле, я бы посоветовал вам почитать официальную документацию и повозиться с кодом, пока я пишу следующую статью этой серии, которую посвящу более сложному контенту.
Ссылки на следующие статьи будут появляться здесь же, так что следите.
Введение в 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
Linux
$ sudo apt-get install libopencv-dev python-opencv
Для проверки результата установки просто введите в терминале Python следующую команду:
Если не появилось сообщение об ошибке, значит библиотека была установлена успешно.
Основные операции с изображениями
Установив OpenCV, давайте теперь, так сказать, пощупаем основные функциональные возможности данной библиотеки.
Вывод изображения на экран
Процесс вывода изображения на экран состоит из двух шагов. Сначала мы должны загрузить изображение, а после этого вывести его на экран. Эти операции выполняются последовательно, и для каждой из них предназначена отдельная функция.
Для вывода изображения на экран нам необходимо задать две вещи:
Таким образом мы загружаем изображение велосипеда из файла bike.png и сохраняем его в переменную my_bike для дальнейшей работы.
Замечание: если в результате выполнения данного кода возникла ошибка, есть только три возможных причины для этого. Первая — вы неправильно задали путь к файлу. Вторая — такого файла просто не существует, и третья — тип изображения (jpg/jpeg/png) задан неверно.
Первый параметр функции imshow() — это строка, которую мы хотим использовать в качестве заголовка к нашему изображению. Второй параметр — это переменная, содержащая загруженное нами изображение.
Сохранение изображений
Вот пример ее использования:
Здесь мы задали название файла и переменную, в которой содержится изображение. Оно будет сохранено в текущую рабочую директорию.
Арифметика изображений
Арифметика изображений включает в себя сложение, вычитание, деление и умножение различных изображений и используется для получения нового изображения при помощи арифметических операций со входными изображениями. Арифметика изображений имеет множество практических применений, как например нанесение водяного знака на картинку, смешение двух изображений, применение к картинкам различных фильтров и так далее.
Из всего множества возможных операций мы рассмотрим только два примера, которые помогут нам понять концепцию арифметических операций в библиотеке OpenСV. В качестве первого примера мы возьмем сложение двух изображений, а в качестве второго — их смешение (blending).
Давайте рассмотрим код этих примеров.
Сложение изображений
Команда waitkey используется для остановки выполнения кода до нажатия любой кнопки клавиатуры. Это весьма удобно, так как в противном случае выведенное на экран изображение только на долю секунды мелькнуло бы на экране, а затем программа завершила бы свое исполнение.
Смешение изображений
Смешение изображений весьма похоже на их сложение, за исключением того, что теперь мы можем контролировать вклад каждого из входящих изображений в результирующее. В общем случае, если мы хотим, чтобы одно из входящих изображений было более контрастным, а другое более размытым при их слиянии, мы должны вместо сложения изображений использовать их смешение.
Чтобы прояснить это, давайте рассмотрим код:
Замечание: изображения могут быть любого типа, но тип всех изображений должен быть одинаковым. Например, если вы используете формат PNG, то все изображения должны быть именно в этом формате.
Сглаживание изображений
Сглаживание изображений является крайне полезной операцией и очень часто используется перед тем как передать картинку для обработки в модель машинного обучения. В основном это нужно делать для фильтрации высокочастотных шумов, применяя для этого низкочастотный фильтр. Существует множество различных фильтров, например усредняющий фильтр (box filter), медианный фильтр (median filter), фильтр типов волн (модовый фильтр, mode filter), фильтр Гаусса (Gaussian filter) и многие другие. Но для понимания сглаживания изображений и его применения в библиотеке OpenCV, мы рассмотрим только первый, усредняющий фильтр (box filter).
Допустим, у вас есть изображение размером 10X10 и вы хотите его пропустить через усредняющий фильтр размером 3Х3. Как вы будете действовать?
Мы начнем с крайнего левого угла нашего изображения, поместим туда фильтр размером 3Х3 и заменим центральный элемент на среднее по всем девяти элементам (сумма элементов, попавших в фильтр, деленная на 9). Это будет только первым этапом. Далее мы сдвинем фильтр на один шаг вправо и повторим эту процедуру. Ниже этот пример наглядно проиллюстрирован.
Применение фильтра к изображению размером 10Х10:
Давайте теперь посмотрим, как можно организовать фильтрацию изображения при помощи библиотеки OpenCV. Пожалуйста, внимательно прочитайте все комментарии к каждой строчке данного кода.
Чтобы увидеть результат на экране, выполните следующий вспомогательный код:
Преобразование изображений
Последней, но одной из самых важных тем, поднятых нами в данном обзоре библиотеки OpenCV, является преобразование изображений. Эта тема находит применение в самых разных приложениях, но отдельно следует упомянуть задачу аугментации данных для моделей машинного обучения. Речь идет о ситуациях, когда в нашем датасете для полноценного обучения недостаточно данных, и мы, дополняя и видоизменяя существующие картинки, увеличиваем первоначальный датасет до нужного размера. Это помогает нам серьезно увеличить точность работы обучаемой модели.
Список возможных преобразований весьма велик и включает в себя масштабирование, афинное преобразование изображений, вращение, транспонирование и многое другое. Мы кратко расскажем только про масштабирование и вращение, но в библиотеке OpenСV есть поддержка всех возможных преобразований. Начнем с масштабирования.
Масштабирование
Здесь в функции resize параметр fx определяет масштаб изменений по ширине, fy — по высоте, а параметр interpolation отвечает за сам способ изменений (то есть расширение или сжатие).
Вращение
Вращение позволяет нам перемещать изображение вокруг определенной оси на заданный угол.
Перед тем как мы научимся вращать наши изображения при помощи библиотеки OpenСV, давайте вспомним, что существует линейный оператор под названием матрица поворота, который как раз и осуществляет преобразования такого рода. Мы не будем вдаваться в математические детали, так как в библиотеке OpenCV эта матрица вычисляется при помощи одного вызова функции. Вы это увидите в следующем коде:
Выводы
Подводя итоги, давайте еще раз пройдемся по наиболее важным местам в нашей статье. Библиотека OpenCV доступна на многих языках и часто используется вместе с библиотеками NumPy, SciPy и Matplotlib, как мы могли заметить в приведенных примерах. Некоторые функции библиотеки взяты из Matlab и также поддерживают векторные вычисления, что сильно повышает вычислительную эффективность.
Кроме того, OpenCV является одной из лучших библиотек для компьютерного зрения, и после прочтения этой статьи вы сможете найти много приложений машинного обучения, которые были разработаны с использованием OpenCV.
Также надо сказать, что данная статья приоткрывает лишь самую малость того, что есть в библиотеке OpenСV. Ее прочтение должно вдохновить вас еще глубже погрузиться в изучение этой библиотеки и узнать о многих других продвинутых функциях в ней.
Про OpenCV (Open Source Computer Vision Library) было немного рассказано здесь.
Это библиотека, которая до 1-й версии разарабатывалась в Центре разработки программного обеспечения Intel (причём, российской командой в Нижнем Новгороде).
OpenCV написана на языке высокого уровня (C/C++) и содержит алгоритмы для: интерпретации изображений, калибровки камеры по эталону, устранение оптических искажений, определение сходства, анализ перемещения объекта, определение формы объекта и слежение за объектом, 3D-реконструкция, сегментация объекта, распознавание жестов и т.д.
Эта библиотека очень популярна за счёт своей открытости и возможности бесплатно использовать как в учебных, так и коммерческих целях.
Фактически, OpenCV – это набор типов данных, функций и классов для обработки изображений алгоритмами компьютерного зрения.
Основные модули библиотеки:
cxcore — ядро
* содержит базовые структуры данных и алгоритмы:
— базовые операции над многомерными числовыми массивами
— матричная алгебра, математические ф-ции, генераторы случайных чисел
— Запись/восстановление структур данных в/из XML
— базовые функции 2D графики
CV — модуль обработки изображений и компьютерного зрения
— базовые операции над изображениями (фильтрация, геометрические преобразования, преобразование цветовых пространств и т. д.)
— анализ изображений (выбор отличительных признаков, морфология, поиск контуров, гистограммы)
— анализ движения, слежение за объектами
— обнаружение объектов, в частности лиц
— калибровка камер, элементы восстановления пространственной структуры
Highgui — модуль для ввода/вывода изображений и видео, создания пользовательского интерфейса
— захват видео с камер и из видео файлов, чтение/запись статических изображений.
— функции для организации простого UI (все демо приложения используют HighGUI)
Cvaux — экспериментальные и устаревшие функции
— пространств. зрение: стерео калибрация, само калибрация
— поиск стерео-соответствия, клики в графах
— нахождение и описание черт лица
CvCam — захват видео
— позволяет осуществлять захват видео с цифровых видео-камер ( поддержка прекращена и в последних версиях этот модуль отсутствует )
Текущая (на момент правки статьи) стабильная версия 2.4.1.
В версии 2.2 структура библиотека реорганизована — теперь вместо больших универсальных модулей (cxcore, Cvaux, Highgui, Cvaux) библиотека OpenCV разделена на небольшие модули по функцианальному использованию:
opencv_core — ядро: базовые структуры, вычисления (математические функции, генерация псевдослучайных чисел, DFT, DCT, ввод/вывод в XML и т.п.)
opencv_imgproc — обработка изображений (фильтры, преобразования и т. д.).
opencv_highgui — простой UI, загрузка/сохранение изображений и видео.
opencv_ml — методы и модели машинного обучения (SVM, деревья принятия решений и т. д.).
opencv_features2d — различные дескрипторы (SURF).
opencv_video — анализ движения и отслеживание объектов (оптический поток, шаблоны движения, устранение фона).
opencv_objdetect — детектирование объектов на изображении (вейвлеты Хаара, HOG и т. д.).
opencv_calib3d — калибровка камеры, поиск стерео-соответстсвия и элементы обработки трехмерных данных.
opencv_flann — библиотека быстрого поиска ближайших соседей (FLANN).
opencv_contrib — сопутствующий код, еще не готовый для применения.
opencv_legacy — устаревший код, сохраненный ради обратной совместимости.
opencv_gpu — ускорение некоторых функций OpenCV за счет CUDA (NVidia).
Книга про OpenCV:
Gary Bradski, Adrian Kaehler «Learning OpenCV. Computer vision with the OpenCV library.»
Начало работы с библиотекой OpenCV
Презентацию к лекции Вы можете скачать здесь.
1. Начало работы с библиотекой OpenCV
Цель настоящего раздела – создать правильное впечатление о возможностях библиотеки OpenCV (http://opencv.org) и дать начальный толчок для дальнейшего его изучения.
1.1. Обзор библиотеки
OpenCV – de facto самая популярная библиотека компьютерного зрения. Она написана на C/C++, ее исходный код открыт. библиотека включает более 1000 функций и алгоритмов. Она разрабатывается c 1998 г., сначала в компании Интел, теперь в Itseez при активном участии сообщества. О высокой популярности библиотеки свидетельствует количество загрузок, их более 6000000 загрузок (без учета svn/git трафика).
Существуют библиотеки, более продвинутые по функциональности, например, Halcon. Есть библиотеки более специализированные, делающие акцент на какой-либо конкретной задаче, например, libmv. OpenCV – самая большая библиотека по широте тематики.
Библиотека распространяется по лицензии BSD, что означает, что ее можно свободно и бесплатно использовать как в открытых проектах с открытым кодом, так и в закрытых, коммерческих проектах. Библиотеку не обязательно копировать целиком в свой проект, можно использовать куски кода. Единственное требование лицензии – наличие в сопровождающих материалах копии лицензии OpenCV.
Из-за либеральной лицензии библиотека используется многими компаниями, организациями, университетами, например, NVidia, Willow Garage, Intel, Google, Stanford University. Компании NVidia и WillowGarage частично спонсируют ее разработку.
Есть основание думать, что не все компании, использующие OpenCV, афишируют это. Приведем небольшой перечень известных авторам проектов, в которых используется OpenCV:
Многомерная архитектура проекта представлена на рис. 4.1. Библиотека состоит из 16 модулей. Реализованы около 1000 алгоритмов. Функциональность доступна на разных языках: C, C++, Python, CUDA, Java. Поддерживаются основные операционные системы: MS Windows, Linux, Mac, Android, iOS. Есть возможность использования сторонних библиотек, например, для работы с устройством Kinect (OpenNI), разработки параллельных программ (TBB) и др.
Проект использует систему непрерывной интеграции. Каждую ночь последние рабочие версии OpenCV скачиваются из репозитория и компилируются на 50 различных конфигурациях (разные операционные системы, разные платформы, разные параметры и т. д.), после чего запускаются регрессионные тесты. Например, проводится реальное тестирование на Android-планшетах.
Основные модули библиотеки можно отнести к 4 группам (разделам):
Обратим внимание на поддержку работы с xml-файлами. Результаты промежуточных вычислений можно сохранять в xml-файлах, а затем их прочитать, например, в другой программе, что облегчает разработку алгоритма по частям, работу над алгоритмом целой командой.
Заметим, что библиотека OpenCV реализует, как правило, только базовые операции, используемые в компьютерном зрении. Таким образом, ее можно рассматривать как в целом низкоуровневую библиотеку компьютерного зрения. Для решения серьезных задач необходимо на основе предоставленных библиотекой кирпичиков создавать свои сложные приложения.
На рисунке ниже представлена общая схема типичного приложения, предназначенного для решения той или иной задачи компьютерного зрения (конечно, не все приложения подпадают под эту схему).
Все начинается с захвата изображений (модуль highgui). Вы читаете изображение из файла или читаете видео с сетевой камеры через сетевой протокол.
Далее осуществляется предварительная обработка (модуль imgproc), такая, как устранение шума, выравнивание яркости, контраста, выделение и удаление бликов, теней. Например, один и тот же объект при разном освещении выглядит по-разному. В ярком свете красная машина, движение которой, необходимо отслеживать, будет ярко-оранжевой. В пасмурную погоду та же машина будет выглядеть красно-розовой. В этом случае на изображении необходимо выполнить выравнивание цветов. Предобработка может быть простой, но может заключать в себе целую сложную технологию.
Следующий этап – выделение особенностей (модули imgproc, features2d). Например, в задаче слежения за объектом это может быть поиск специальных точек на объекте, за которыми легко наблюдать; для задачи детектирования (т. е. обнаружения на изображении) лица – вычисления описания каждого пиксела.
Далее происходит детектирование интересующих нас объектов, выделение значимых частей, сегментация изображения (модули imgproc, objdetect). Если, например, камера неподвижна, а изображение подвижное, можно использовать алгоритмы вычитания фона.
После этого вы решаете основную задачу, такую, как вычисление расположения объекта в 3d, реконструкцию 3d структуры, анализ структуры, регистрацию и т. п. (модули calib3d, contrib, video, stitching, videostab, ml). Например в задаче склейки панорам изображений – это сопоставление частей разных кадров, определение нужного преобразования. В задаче видеонаблюдения это восстановление траекторий объектов и т. д.
В конце происходит распознавание и принятие конкретных решений (модуль ml). Например, в системе видеонаблюдения: появился нежелательный объект в кадре или нет. В задаче детектирования текста – детектирован текст, что именно за текст и т. д.
Вот вкратце базовое описание основных компонентов OpenCV и схемы работы с библиотекой. Теперь рассмотрим библиотеку более подробно.