Опубликован: 20.08.2013 | Уровень: для всех | Доступ: платный | ВУЗ: Новосибирский Государственный Университет
Лекция 4:

Начало работы с библиотекой OpenCV

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Аннотация: В лекции приводятся: обзор библиотеки OpenCV, описание программ на C/C++ и Python.

Презентацию к лекции Вы можете скачать здесь.

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:

  • Система зрения робота PR2, разработанного компанией WillowGarage (www.willowgarage.com). Проект PR2 нацелен на решение сложной задачи – создание платформы для персональной робототехники.
  • Аудио-визуальная инсталляция в Музее Современного Искусства (Сан-Франциско).
  • Контроль качества монет, изготавливаемых Центробанком Китая.
  • Курсы компьютерного зрения в Стэнфорде.
  • Панорамы улиц в картах Google.

Многомерная архитектура проекта представлена на рис. 4.1. Библиотека состоит из 16 модулей. Реализованы около 1000 алгоритмов. Функциональность доступна на разных языках: C, C++, Python, CUDA, Java. Поддерживаются основные операционные системы: MS Windows, Linux, Mac, Android, iOS. Есть возможность использования сторонних библиотек, например, для работы с устройством Kinect (OpenNI), разработки параллельных программ (TBB) и др.

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


Рис. 4.1.

Основные модули библиотеки можно отнести к 4 группам (разделам):

  • Модули core, highgui, реализующие базовую функциональность (базовые структуры, математические функции, генераторы случайных чисел, линейная алгебра, быстрое преобразование Фурье, ввод/вывод изображений и видео, ввод/вывод в форматах XML, YAML и др.).
  • Модули imgproc, features2d для обработки изображений (фильтрация, геометрические преобразования, преобразование цветовых пространств, сегментация, обнаружение особых точек и ребер, контурный анализ и др).
  • Модули video, objdetect, calib3d (калибровка камеры, анализ движения и отслеживание объектов, вычисление положения в пространстве, построение карты глубины, детектирование объектов, оптический поток).
  • Модуль ml, реализующий алгоритмы машинного обучения (метод ближайших соседей, наивный байесовский классификатор, деревья решений, бустинг, градиентный бустинг деревьев решений, случайный лес, машина опорных векторов, нейронные сети и др.).

Обратим внимание на поддержку работы с xml-файлами. Результаты промежуточных вычислений можно сохранять в xml-файлах, а затем их прочитать, например, в другой программе, что облегчает разработку алгоритма по частям, работу над алгоритмом целой командой.

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

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


Рис. 4.2.

Все начинается с захвата изображений (модуль highgui). Вы читаете изображение из файла или читаете видео с сетевой камеры через сетевой протокол.

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

Следующий этап – выделение особенностей (модули imgproc, features2d). Например, в задаче слежения за объектом это может быть поиск специальных точек на объекте, за которыми легко наблюдать; для задачи детектирования (т. е. обнаружения на изображении) лица – вычисления описания каждого пиксела.

Далее происходит детектирование интересующих нас объектов, выделение значимых частей, сегментация изображения (модули imgproc, objdetect). Если, например, камера неподвижна, а изображение подвижное, можно использовать алгоритмы вычитания фона.

После этого вы решаете основную задачу, такую, как вычисление расположения объекта в 3d, реконструкцию 3d структуры, анализ структуры, регистрацию и т. п. (модули calib3d, contrib, video, stitching, videostab, ml). Например в задаче склейки панорам изображений – это сопоставление частей разных кадров, определение нужного преобразования. В задаче видеонаблюдения это восстановление траекторий объектов и т. д.

В конце происходит распознавание и принятие конкретных решений (модуль ml). Например, в системе видеонаблюдения: появился нежелательный объект в кадре или нет. В задаче детектирования текста – детектирован текст, что именно за текст и т. д.

Вот вкратце базовое описание основных компонентов OpenCV и схемы работы с библиотекой. Теперь рассмотрим библиотеку более подробно.

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Александра Максимова
Александра Максимова

При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка?
 

Алена Борисова
Алена Борисова

В лекции по обработке полутоновых изображений (http://www.intuit.ru/studies/courses/10621/1105/lecture/17979?page=2) увидела следующий фильтр:


    \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 2 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array} - \frac{1}{9} \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 1 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array}

В описании говорится, что он "делает изображение более чётким, потому что, как видно из конструкции фильтра, в однородных частях изображение не изменяется, а в местах изменения яркости это изменение усиливается".

Что вижу я в конструкции фильтра (скорее всего ошибочно): F(x, y) = 2 * I(x, y) - 1/9 I(x, y) = 17/9 * I(x, y), где F(x, y) - яркость отфильтрованного пикселя, а I(x, y) - яркость исходного пикселя с координатами (x, y). Что означает обычное повышение яркости изображения, при этом без учета соседних пикселей (так как их множители равны 0).

Объясните, пожалуйста, как данный фильтр может повышать четкость изображения?

Сергей Кротов
Сергей Кротов
Россия
Дмитрий Донсков
Дмитрий Донсков
Россия, Москва, Московский Авиационный Институт