Статья:

ДЕТЕКТИРОВАНИЕ И РАСПОЗНАВАНИЕ СИМВОЛОВ НА ВИДЕО С ПОМОЩЬЮ OPENCV

Конференция: II Студенческая международная заочная научно-практическая конференция «Молодежный научный форум: технические и математические науки»

Секция: 3. Информационные технологии

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

ДЕТЕКТИРОВАНИЕ И РАСПОЗНАВАНИЕ СИМВОЛОВ НА ВИДЕО С ПОМОЩЬЮ OPENCV

Сумин Виталий Андреевич
студент Национального исследовательского Томского политехнического университета, г. Томск
Аксентий Евгений Илиевич
студент Национального исследовательского Томского политехнического университета, г. Томск
Аксенов Сергей Владимирович
научный руководитель, научный руководитель, доцент Национального исследовательского Томского политехнического университета, г. Томск

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

Введение

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

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

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

Методология

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

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

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

b.  Обнаружение объекта это нахождение координат объекта на изображении. Т. е. такая программа отвечает на вопрос «где на изображении находится искомый объект».

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

Функции

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].

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]

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.  Матрица различий

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

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

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

Параметры:

src1 — Первый входящий массив или число.

src2 — Второй входящий массив или число.

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

Результаты

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

1)  Захват видео с веб-камеры (см. рис. 1a).

2)  Конвертирование изображения в 8-битное изображение в оттенках серого (см. рис. 1b) для того чтобы использовать его в таких фильтрах как Threshold (пороговое преобразование) и Canny (нахождение границ).

3)  Создание элементов графического интерфейса — слайдеров для того чтобы настраивать минимальный и максимальный размеры символов, которые нужно искать на изображении.

4)  Преобразование изображения в оттенках серого в черно-белое изображение, используя функцию adaptiveThreshold(пороговое преобразование с адаптивной величиной порога) (см. рис. 1c).

5)  Нахождение сторон объектов, используя фильтр Canny (см. рис. 1d).

6)  Нахождение контуров, используя функцию findContours (см. рис. 1e).

7)  Конвертирование контуров в полигоны (изображение с заполненными полигонами) и нахождение ограничивающих прямоугольников этих полигонов (см. рис. 1f).

8)  Теперь мы знаем, где находится каждый объект и его размеры, и мы можем обработать каждый объект по отдельности.

9)  Масштабировать изображения каждого объекта до размера 5 на 7 пикселей чтобы сравнить с шаблонами символов хранящихся в файлах. (см. рис. 2).

 

Описание: C:\Users\Виталий\Desktop\диплом 2 глава\практика\рис1.png

Рисунок 1. Шаги обработки изображения

 

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

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

 

Рисунок 2. Сравнение с шаблонами. Первая строка содержит символы извлеченные из входного изображения. Вторая строка содержит шаблоны символов

 

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

 

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

 

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

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).