Простой пример применения библиотеки компьютерного зрения для выделения объектов на изображении

Компьютерное зрение — теория и технология создания машин, которые могут производить обнаружение, отслеживание и классификацию объектов. То есть, это такие технологии, которые наделяют компьютер способностью видеть и извлекать информацию из увиденного.

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

Затрагивая тему компьютерного зрения сложно не рассмотреть такое его направление, как теория распознавания образов.


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

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

Предлагаю ознакомиться с пошаговым процессом выделения объектов на изображении при помощи библиотеки алгоритмов компьютерного зрения OpenCV (Open Source Computer Vision Library). Данный пример является довольно простым случаем, но позволяет произвести неглубокий обзор некоторых функций довольно мощной библиотеки. Как язык программирования возьмем язык разработки данного продукта – C/C++.

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

Посмотреть результат можно при помощи еще одной функции:

И результат отобразится в отдельном окне:

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

В итоге получается следующее:


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

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

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

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


Таким образом получилось контрастное изображение, готовое к методу поиска контуров.

Для успешной работы функции требуются семь параметров. Первыми идут исходное изображение и переменная для сохранения полученных контуров, которые описываются с использованием цепного кода Фримена. Затем следует опциональный вектор, который будет содержать в себе информацию о топологии контуров изображения. После него указывается режим поиска, который может быть выбран установлением нужного флага. Выделены четыре возможных режима: выделяющий только внешние контуры; извлекающий все контуры без установления иерархических отношений; организующий контуры в двухуровневую иерархию, и режим, сохраняющий все вложения. После указывается метод аппроксимации контура, который также варьируется в зависимости от флага. Это может быть режим без аппроксимации, который сохранит все точки. Режим простой аппроксимации, который сжимает горизонтальные, вертикальные и диагональные сегменты до крайних точек. И вариант, который применяет одну из разновидностей алгоритма аппроксимации цепочки Тэ-Чина. Последним указывается смещение, которое определяет на какое расстояние точки будут отодвинуты от контура.

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


Традиционно, выделим найденные объекты в прямоугольники. Для того чтобы подготовить найденные на изображении контуры к обработке, их необходимо аппроксимировать к многоугольникам. Функция аппроксимации, основанная на алгоритме Рамера-Дугласа-Пекера, сокращает количество вершин в зависимости от указанной точности:

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

После чего можно приступать к поиску ограничивающего прямоугольника для каждой фигуры:

И результат, который позволяет сказать, что поставленная задача была выполнена:


Итак, область компьютерного зрения и теория распознавания образов являются весьма интересными и перспективными направлениями изучения. В библиотеке OpenCV применяется разнообразная теория данной области, которая не всегда является простой к пониманию. Но взаимодействие с OpenCV упрощено наличием подробной документацией с достаточным количеством примеров.