Детектирование и распознавание символов на видео с помощью OpenCV

Авторы: Сумин В.А., Аксентий Е.И., Аксенов С.В.
Источник: Сумин В.А., Аксентий Е.И. ДЕТЕКТИРОВАНИЕ И РАСПОЗНАВАНИЕ СИМВОЛОВ НА ВИДЕО С ПОМОЩЬЮ OPENCV // Молодежный научный форум: Технические и математические науки: электр. сб. ст. по мат. II междунар. студ. науч.-практ. конф. № 2(2). URL: https://nauchforum.ru/archive/MNF_tech/2(2).pdf (дата обращения: 20.12.2018)

1. Аннотация

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

2. Введение

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

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

Чтобы сделать такое приложение, нужно разработать алгоритм, который будет находить, и распознавать символы в видео. Дальнейшие шаги это группирование символов в слова и в предложение и отправка этого предложения в модуль, который будет заниматься переводом. В этой статье будет рассмотрен только алгоритм нахождения и распознавания символов.

3. Методология

В алгоритмах машинного зрения изображение трансформируется в другое изображение или в ответ [1]. Ответ может быть «Картинка содержит яблоко» или «Картинка содержит 2х собак и одну кошку». Чтобы достичь результата, проблема разбивается на несколько маленьких подзадач, которые решаются различными алгоритмами, многие из которых уже предоставлены библиотекой OpenCV в виде стандартных функций.

Дадим определения для выражений обнаружение объекта и распознавание объекта:

  • Распознавание объекта дает ответ на вопрос, что изображено на изображении. Существует много различных способов классифицировать объект, например, нейронные сети, сравнение гистограмм, признаки Хаара, байесовский классификатор и т. д.
  • Обнаружение объекта это нахождение координат объекта на изображении. Т. е. такая программа отвечает на вопрос «где на изображении находится искомый объект».

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

4. Функции

4.1 Конвертирование цветового формата

Цветные изображения обычно представлены в формате RGB (красный, зеленый, синий). Это означает, что каждая точка изображения задается комбинацией трех чисел: красный — (0..255), зеленый — (0..255) и голубой — (0..255). Такое представление не всегда является удобным для обработки изображений, в OpenCVможно конвертировать формат изображения с помощью функции cvtColor, которая может конвертировать формат RGB в формат HSV, оттенки серого, и еще в много других форматов.

Имя и параметры функции:

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0);

Parameters: src — Входное изображение

dst — Изображение на выходе.

code — Код типа конвертации.

dstCn — Количество каналов в выходном изображении. Если параметр равен 0, количество каналов выставляется автоматически на основе входного изображения и кода конвертации” [3].

4.2 Пороговое преобразование

Пороговое преобразование это преобразование изображения на основе порогового значения. Каждый пиксель исходного изображения сравнивается с некоторым пороговым значением и на основе этого сравнения в выходное изображение записывается белый либо черный пиксель. Существует несколько типов порогового преобразования. Например, мы можем установить черный(0) цвет для значений меньше 100 и белый (255) для значений больше 100. В итоге мы получим черно-белое изображение, где на месте темных участков будет черный цвет, а на месте светлых белый цвет. Также мы могли задать белый цвет для значений больше 200 и оставить остальные значения без изменений. Все зависит от того что именно мы хотим выделить.

Для этой цели в библиотеке OpenCV есть две функции. Первая это cv::threshold:

double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);[3]

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

Вторая функция автоматически подбирает пороговое значение. Эта функция называется cv::adaptiveThreshold:

void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C) [3]

4.3 Нахождение контуров

В OpenCV есть функция Canny, она используется, чтобы найти края на изображении.

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

void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false); [2]

Результатом выполнения функции Canny является черно-белое изображение, где белые линии это найденные края. Чтобы получить контуры есть другая функция, которая должна быть выполнена после выполнения функции Canny. Эта функция называется cv::findContours:

void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point()) [4]

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

4.4 Матрица различий

Нахождение матрицы различий будет полезным, когда мы будем сравнивать символ с шаблоном. Чтобы найти матрицу различий в OpenCV есть простая функция absdiff:

absdiff вычисляет разницу по модулю для каждого элемента между двумя матрицами или между матрицей и числом.

void absdiff(InputArray src1, InputArray src2, OutputArray dst)

Параметры:

  • src1 — Первый входящий массив или число.
  • src2 — Второй входящий массив или число.
  • dst — Выходной массив, имеющий такой же результат как и первый входящий массив src1 (or src2) [4].

5. Результаты

Был разработан алгоритм распознавания символов. Алгоритм состоит из нескольких частей:

  1. Захват видео с веб-камеры (см. рис. 1a).
    Шаги обработки изображения

    Шаги обработки изображения

  2. Конвертирование изображения в 8-битное изображение в оттенках серого (см. рис. 1b) для того чтобы использовать его в таких фильтрах как Threshold (пороговое преобразование) и Canny (нахождение границ).
  3. Создание элементов графического интерфейса — слайдеров для того чтобы настраивать минимальный и максимальный размеры символов, которые нужно искать на изображении.
  4. Преобразование изображения в оттенках серого в черно-белое изображение, используя функцию adaptiveThreshold(пороговое преобразование с адаптивной величиной порога) (см. рис. 1c).
  5. Нахождение сторон объектов, используя фильтр Canny (см. рис. 1d).
  6. Нахождение контуров, используя функцию findContours (см. рис. 1e).
  7. Конвертирование контуров в полигоны (изображение с заполненными полигонами) и нахождение ограничивающих прямоугольников этих полигонов (см. рис. 1f).
  8. Теперь мы знаем, где находится каждый объект и его размеры, и мы можем обработать каждый объект по отдельности.
  9. Масштабировать изображения каждого объекта до размера 5 на 7 пикселей чтобы сравнить с шаблонами символов хранящихся в файлах. (см. рис. 2).
    Финальный результат. Кириллические буквы заменены на латинские буквы. a) оригинальное изображение; b) результат

    Финальный результат. Кириллические буквы заменены на латинские буквы. a) оригинальное изображение; b) результат

  10. Сравнить каждое изображение с каждым шаблоном (см. рис. 2).

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

  11. Нарисуем символ поверх видео. Чтобы стереть реальный символ используем функцию размытия blur (см рис. 3). Сравнение с шаблонами. Первая строка содержит символы извлеченные из входного изображения. Вторая строка содержит шаблоны символов

6. Список литературы

  1. Ali Arya, Farzin Farhadi-Niaki, (n.d.) An Implementation on Object Move Detection Using OpenCV. — [Электронный ресурс] — Режим доступа. — URL:http://www.sce.carleton.ca/~ffniaki/An Implementation on Object Move Detection Using OpenCV.pdf (дата обращения 10.06.2012).
  2. Feature detection — OpenCV v2.4.1 documentation — [Электронный ресурс] — Режим доступа. — URL:http://docs.opencv.org/modules/imgproc/doc/feature_detection.html?highlight=canny#cv.Canny (дата обращения 10.06.2012).
  3. Miscellaneous Image Transformations — OpenCV v2.4.1 documentation — [Электронный ресурс] — Режим доступа. — URL:http://docs.opencv.org/modules/imgproc/doc/miscellaneous_transformations.html (дата обращения 10.06.2012).
  4. Operations on Arrays – OpenCV v2.4.1 documentation — [Электронный ресурс] — Режим доступа. — URL:http://opencv.itseez.com/modules/core/doc/operations_on_arrays.html (дата обращения 10.06.2012).
  5. Structural Analysis and Shape Description — OpenCV v2.4.1 documentation — [Электронный ресурс] — Режим доступа. — URL:http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours#cv.FindContours (дата обращения 10.06.2012).