Начало работы с библиотекой OpenCV
Сайт библиотеки – http://opencv.org. На нем можно загрузить библиотеку для разных платформ, найти документацию по библиотеке, краткие инструкции по установке (Quick Start), уроки по ее использованию (Tutorials), справочную карту (Cheat Sheet), которую полезно сразу распечатать, ссылки на полезные сайты и т. п. Ссылка WIKI ведет на сайт для разработчиков http://code.opencv.org.
На сайте http://docs.opencv.org собрана вся документация. В частности, имеются подробные описания всех функций с полнотекстовым поиском.
На сайте http://answers.opencv.org можно задать свой вопрос, касающийся библиотеки, и получить на него ответ от разработчиков или других пользователей. Прежде чем сформулировать свой вопрос, имеет смысл попытаться найти похожий, среди тех, которые уже задавали. Наиболее популярные вопросы попадают на верх списка. На них нужно обратить внимание в первую очередь.
1.3. OpenCV на Python'еДля первых экспериментов с библиотекой авторы рекомендуют использовать Python (http://python.org). Программу на этом языке можно писать в любом текстовом редакторе. Далее без предварительной компиляции она выполняется интерпретатором Python. Python с библиотекой NumPy превращается в бесплатный аналог системы MATLAB, при этом сам язык более продвинутый, чем язык MATLAB.
Мы предлагаем следующую последовательность шагов для быстрого сайта (на примере Windows):
- Загружаем самораспаковывающийся архив с SourceForge: http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.3/ и распаковываем его в какой-нибудь домашний каталог.
- Загружаем и устанавливаем Python 2.7.x c http://python.org, загружаем и устанавливаем NumPy: http://numpy.scipy.org (выбираем версию, соответствующую версии Python).
- Копируем cv2.pyd из распакованного каталога OpenCV в <каталог Python>\Lib\site-packages.
Можно начинать эксперименты!
1.3.1. Первая программаНабираем следующую программу в текстовом редакторе (first.py):
Программа загружает изображение, имя которого указывается в параметрах запуска программы, применяет к нему серию преобразований и отображает результат.
Копируем файл lena.jpg из <opencv>/samples/c в каталог, где находится first.py, и запускаем программу (из Far, cmd и т. п.) командой:
Исходное изображение и результат показаны на рисунке.
Обратим внимание на вызов функции cv.GaussianBlur в коде программы, которая осуществляет размытие. Если бы его не было, на выходе получили бы слишком много ребер.
Функция cv.waitKey() не только ждет нажатие произвольной клавиши на клавиатуре, но и выполняет обработку сообщений от операционной системы, в частности запросы на отрисовку окна. Без этой команды окно бы не "слушалось" действий пользователя.
1.3.2. Вторая программа: добавляем видеоНастоящее компьютерное зрение начинается, когда появляется работа с "живыми" камерами. В следующей программе (second.py) добавим обработку видео. Для каждого кадра будем выполнять те же операции, что и в предыдущей программе для одного изображения.
Здесь функция cv.waitKey() вызывается с одним входным аргументом. Это количество миллисекунд (в нашем случае 30), в течение которого система ожидает нажатия на клавишу. По-умолчанию (как в программе first.py) используется значение 0, что означает бесконечное время ожидания. Функция возвращает код нажатой клавиши. Если клавиша не нажата, то возвращается -1.
Обратите внимание на небольшой размер программы, которая, тем не менее, дает довольно эффектный результат.
1.3.3. Третья программа: добавляем детектирование лицДобавим процедуру детектирования лиц. Получим следующий код (face.py):
Сначала с помощью функции cv.CascadeClassifier() загружаем обученную модель (каскадный классификатор) для детектирования лиц.
Если применять алгоритм детектирования к ребрам, то лиц, скорее всего, не найдем, поэтому алгоритм применяем к исходному изображению после его преобразования в монохромное изображение и масштабирования. Использование большого разрешения в задаче детектирования лиц особого смысла не имеет, поэтому изображение масштабируем (функцией cv.resize() ). В результате с помощью изотропного (одинакового по обоим осям) масштабирования помещаем изображение в прямоугольник размера .
Алгоритм детектирования (детектор) вызываем функцией cascade.detectMultiScale() . Выделяем ребра и совмещаем изображения. Вокруг найденного лица рисуем красный прямоугольник.
Обратим внимание, что нигде не требуется явно выделять и освобождать память для хранения изображений: все происходит автоматически. Это сокращает время разработки программ и создания прототипов
Перед запуском программы копируем lpbcascade_frontalface.xml из <OpenCV>/data/lbpcascades в тот же каталог, что и face.py . Запускаем:
Результат показан на рисунке.
1.3.4. Несколько замечаний об использовании связки Python + OpenCVИспользование OpenCV в связке с Python удобно для создания простых приложений, проведения первых экспериментов, создания прототипов. Заметим, что на языке Python доступна практически вся функциональность библиотеки. Слабым местом могла бы быть производительность, но если использовать "векторно-матричную" идеологию (как в MATLAB'е), то можно получать и достаточно быстрый код. Для этого следует избегать обработки изображений попиксельно и других массивов поэлементно в циклах. Вместо этого использовать векторные функции, которые работают сразу со всем изображением или массивом.
Другое хорошее свойство Python – его самодокументированность. В интерактивной сессии Python (в командном окне) можно быстро получить список доступных функций, список методов конкретного класса, быструю справку по каждой функции и т. д.:
Обертки для Python генерируются автоматически на этапе сборки библиотеки.
Настоятельно рекомендуем ознакомиться с набором примеров на Python, которые можно найти в папке <OpenCV>/samples/python2: устранение размытия в результате движения камеры, распознавание рукописных цифр, видеоэффекты и т. д.