Важнейшими источниками информации о внешнем мире для робота являются его оптические датчики и камеры. После получения изображения необходима его обработка для анализа обстановки или принятия решения. Как я говорил ранее,
компьютерное зрение объединяет множество методов работы с изображениями.
При функционировании робота предполагается, что видеоинформация с камер обрабатывается какой-либо программой, запущенной на контроллере. Чтобы не писать код с нуля, можно воспользоваться готовыми программными решениями. На текущий момент существует множество готовых библиотек компьютерного зрения:
- Matrox Imaging Library
- Camellia Library
- Open eVision
- HALCON
- VXL
- libCVD
- IVT
- OpenCV
- и т.д…
Данные SDK могут сильно различаться по функциональности, условиям лицензирования, используемым языкам программирования. Мы же подробнее остановимся на
OpenCV.
Она бесплатна как для учебных целей, так и для коммерческого использования. Написана на оптимизированном C/C++, поддерживает интерфейсы C, C++, Python, Java и включает в себя реализации свыше 2500 алгоритмов.
Помимо стандартных функций обработки изображений (фильтрация, размытие, геометрические преобразования и т.д…) данный SDK позволяет решать более сложные задачи, к которым относятся обнаружение объекта на фотографии и его «узнавание». Следует понимать, что задачи обнаружения и распознавания могут быть совершенно различными:
- поиск и распознавание конкретного объекта,
- поиск объектов одной категории (без распознавания),
- только распознавание объекта (уже готовое изображение с ним).
Для обнаружения признаков на изображении и проверки на совпадение в OpenCV имеются следующие методы:
- Гистограмма направленных градиентов HOG(Histogram of Oriented Gradients) — может применяться для обнаружения пешеходов
- Алгоритм Виолы-Джонса — применяется для поиска лиц
- Алгоритм обнаружения признаков SIFT (Scale Invariant Feature Transform)
- Алгоритм обнаружения признаков SURF (Speeded Up Robust Features)
Например, SIFT обнаруживает наборы точек, которые можно использовать для идентификации объекта.
Помимо приведенных методик в OpenCV имеются и другие алгоритмы для детектирования и распознавания, а также набор алгоритмов, относящихся к машинному обучению, таких как метод k ближайших соседей, нейронные сети, метод опорных векторов и т.д…
В целом OpenCV предоставляет инструментарий, достаточный для решения подавляющего большинства задач компьютерного зрения. Если алгоритм не имеется в составе SDK, то, как правило, он может быть без проблем запрограммирован. Кроме того, существует множество авторских версий алгоритмов, написанных пользователями на основе OpenCV.
Также следует отметить, что за последние годы OpenCV сильно расширилась и стала в некоторой степени «тяжеловесной». В связи с этим, разными группами энтузиастов создаются «облегченные» библиотеки, основанные на OpenCV. Примеры: SimpleCV, liuliu ccv, tinycv…
Полезные сайты
- http://opencv.org/ — Основной сайт проекта
- http://opencv.willowgarage.com/wiki/ — Старый сайт проекта с документацией по старым версиям
- http://locv.ru — Обучение с примерами на русском
- http://robocraft.ru/page/opencv/ — Раздел на Робокрафте
- http://opencv-srf.blogspot.ru/ — Обучение с примерами
Литература
- G. Bradski. Learning OpenCV: Computer Vision with the OpenCV Library. O’Reilly, 2008.
- J. Solem. Programming Computer Vision with Python. O’Reilly, 2012.
- R. Laganiere. OpenCV 2 Computer Vision Application Programming Cookbook. Packt Publishing, 2011
Спасибо!
Информация по OpenCV очень интересна.
В будущем, будет интересно понять, насколько микрокомпьютеры RaspberryPi и BeagleBone Black способны решать задачи по распознаванию образов.