МИНОБРНАУКИ РОССИИ
Федеральное государственное автономное образовательное учреждение высшего образования
«Национальный исследовательский университет
«Московский институт электронной техники»
Факультет микроприборов и технической кибернетики
Кафедра информатики и программного обеспечения вычислительных систем
Кузьмина Вера Вячеславовна
Бакалаврская работа
по направлению 09.03.04 «Программная инженерия»
Разработка программного модуля генерации изображений номерных знаков
автомобилей
Студент
Кузьмина В.В.
Научный руководитель,
доцент каф. ИПОВС, к.т.н.
Кононова А.И.
Москва 2017
СОДЕРЖАНИЕ
ПЕРЕЧЕНЬ ИСПОЛЬЗУЕМЫХ СОКРАЩЕНИЙ: .................................................................... 4
ВВЕДЕНИЕ ..................................................................................................................................... 5
1. ИССЛЕДОВАТЕЛЬСКИЙ РАЗДЕЛ ........................................................................................ 8
1.1. Актуальность выбранной темы .......................................................................................... 8
1.2. Исследование предметной области ................................................................................... 8
1.3. Цель и задачи разработки ................................................................................................. 11
1.4. Математическая модель геометрических искажений номера ...................................... 12
1.4.1. Аффинные и перспективные геометрические преобразования ............................ 12
1.4.2. Перспективные геометрические искажения номерных знаков ............................. 17
1.5. Обзор существующих программных решений............................................................... 20
1.5.1. Графический редактор Adobe Photoshop ................................................................. 21
1.5.2. Графический редактор Gimp ..................................................................................... 22
1.5.3. Платформа для создания приложений Unity ........................................................... 23
1.6. Требования к составу выполняемых функций ПМ ГИНЗА.......................................... 26
1.7. Организация входных и выходных данных ПМ ГИНЗА .............................................. 26
1.8. Алгоритм и структура данных ПМ ГИНЗА ................................................................... 27
1.9. Перспективы развития ...................................................................................................... 29
Выводы ...................................................................................................................................... 30
2. КОНСТРУКТОРСКИЙ РАЗДЕЛ ............................................................................................ 31
2.1. Выбор инструментальных средств разработки .............................................................. 31
2.1.1. Выбор языка программирования .............................................................................. 31
2.1.3. Описание используемых библиотечных средств .................................................... 35
2.1.4. Выбор среды разработки ........................................................................................... 36
2.1.5. Выбор системы контроля версий .............................................................................. 41
2.2. Требования к составу и параметрами технических средств ......................................... 47
2.3. Требования к надежности ПМ ГИНЗА ........................................................................... 49
2.4. Требования к информационной и программной совместимости ................................. 49
2.5. Программная реализация .................................................................................................. 49
2.5.1. Объектно-ориентированный подход ........................................................................ 49
2
2.5.2. Единый стиль написания кода .................................................................................. 51
2.5.3. Описание классов ПМ ГИНЗА ................................................................................. 52
2.6. Описание графического интерфейса ............................................................................... 55
2.7. Результаты использования ПМ ГИНЗА для обучения нейронной сети ...................... 60
Выводы ...................................................................................................................................... 63
3. ТЕХНОЛОГИЧЕСКИЙ РАЗДЕЛ ........................................................................................... 64
3.1. Отладка ПМ ГИНЗА ......................................................................................................... 64
3.1.1. Использование отладчика Microsoft Visual Studio для отладки ПМ ГИНЗА ....... 65
3.1.2. Отладка ошибок использования памяти ПМ ГИНЗА с помощью Dr. Memory ... 68
3.1.3. Отладка ПМ ГИНЗА с помощью системы рецензирования кода Review Board . 68
3.1.4. Логирование ................................................................................................................ 70
3.1.5. Результаты отладки ПМ ГИНЗА .............................................................................. 70
3.2. Тестирование ПМ ГИНЗА ................................................................................................ 71
3.2.1. Модульное, интеграционное и системное тестирование ПМ ГИНЗА .................. 71
3.2.2. Тестирование методами «белого ящика» и «чёрного ящика» ............................... 75
3.2.3. Тестирования пользовательского интерфейса ПМ ГИНЗА ................................... 77
3.2.4. Использование инструмента непрерывной интеграции Jenkins ............................ 78
3.2.5. Тестирование производительности ПМ ГИНЗА ..................................................... 79
3.2.6. Результаты тестирования ПМ ГИНЗА ..................................................................... 81
Выводы ...................................................................................................................................... 82
Заключение ................................................................................................................................... 83
СПИСОК ЛИТЕРАТУРЫ ............................................................................................................ 85
ПРИЛОЖЕНИЕ 1. Техническое задание ............................................................................... 1 - 8
ПРИЛОЖЕНИЕ 2. Руководство оператора .......................................................................... 1 - 24
ПРИЛОЖЕНИЕ 3. Текст программы .................................................................................... 1 - 21
ПРИЛОЖЕНИЕ 4. Шаблоны изображений, генерируемых ПМ ГИНЗА ............................ 1 - 5
ПРИЛОЖЕНИЕ 5. Конфигурационный файл с параметрами ПМ ГИНЗА......................... 1 - 3
3
ПЕРЕЧЕНЬ ИСПОЛЬЗУЕМЫХ СОКРАЩЕНИЙ:
API (Application Programming Interface) – интерфейс прикладного программирования
IDE (Integrated Development Environment) – система программных средств
OpenCV (Open Source Computer Vision Library) – библиотека компьютерного зрения с
открытым исходным кодом
SVM (Support Vector Machine) - метод опорных векторов
STL (Standard Template Library) - стандартная библиотека шаблонов С++
ОС – операционная система
ПК – персональный компьютер
ПМ – программный модуль
ПМ ГИНЗА - программный модуль генерации изображений номерных знаков автомобилей
ПО – программное обеспечение
ЯП – язык программирования
4
ВВЕДЕНИЕ
В
современном
увеличивающимся
мире
невозможно
автомобильным
представить
потоком
без
контроль
технологии
за
постоянно
распознавания
регистрационных знаков автомобилей. Идентификация автомобилей по их номерному знаку
является важным аспектом обеспечения безопасности дорожного движения.
Одним из подходов к распознаванию изображений символов автомобильного номера
является использование сверточных нейронных сетей [3]. Методика распознавания номера
состоит из пяти этапов – поиск номерной пластины на фотографии, выделение на
полученном снимке символов номера, разбиение номера на символы, распознавание
каждого из этих символов, и оценка надежности распознавания каждого символа [4].
Алгоритмы распознавания номерных знаков автомобилей должны быть устойчивыми к
искажениям изображений номерных пластин, связанным со скоростью движения
автомобилей и положением камеры относительно номерного знака.
До настоящего времени в компании АО «ЭЛВИС-НеоТек» для обучения
рассматриваемой нейронной сети использовались фотографии, полученные с помощью
реальных съёмок. Эти фотографии отбирались и обрабатывались вручную, в частности, на
каждом снимке должно было находиться только одно изображение номерного знака. Кроме
того, имя каждого файла должно было содержать номер, который изображен на фотографии.
Такой процесс приводил к большим затратам времени на создание обучающей выборки.
Одной из проблем распознавания автомобильных номеров является разнообразие их
видов, которые отличаются начертанием символов и размерами номерных пластин. Для
обучения нейронной сети требуется качественная и большая выборка изображений
автомобильных номеров. Но иногда сложно получить достаточное количество примеров
изображений номерных знаков определённого вида с помощью реальных съёмок [6]. В связи
с этим в данной работе было решено протестировать подход с машинным обучением на
изображениях номерных знаков, которые сгенерированы программно, а не получены с
помощью натуральных съемок.
Актуальность задачи заключается в необходимости быстрой и эффективной
адаптации систем распознавания к любым региональным стандартам номеров.
Целью данной работы является повышение скорости формирования обучающей
выборки и качества обучения нейронной сети.
5
Для выполнения данной работы были поставлены следующие задачи:
исследование предметной области;
сравнительный анализ существующих программных решений;
выбор инструментальных средств и среды разработки;
разработка схемы данных ПМ ГИНЗА;
разработка алгоритма работы ПМ ГИНЗА;
разработка пользовательского интерфейса ПМ ГИНЗА;
программная реализация ПМ ГИНЗА;
отладка и тестирование ПМ ГИНЗА;
разработка руководства оператора.
Практическая значимость данной работы отражается в том, что ПМ ГИНЗА внедрён
на предприятии АО «ЭЛВИС-НеоТек» в системах «Перекрёсток» [8] и «Паркинг Контроль»
[9]. Использование ПМ ГИНЗА позволило значительно повысить скорость формирования
обучающих выборок. Переобучение нейронной сети, входящей в состав системы
«Перекрёсток», на сгенерированной ПМ ГИНЗА выборке, улучшило результаты
распознавания израильских номеров с 82.7% до 94.63%, при этом процент ошибочно
распознанных номеров уменьшился с 2.1% до 0.99%, а доля нераспознанных номеров
сократилась с 14.1% до 5.38%.
Пояснительная записка содержит введение, три раздела: исследовательский,
конструкторский и технологический, заключение, список использованной литературы и
пять приложений.
В
исследовательском
разделе
описывается
актуальность
выбранной
темы,
исследование предметной области, анализ существующих программных продуктов,
проанализированы функциональные требования к ПМ ГИНЗА, структура входных и
выходных данных, приводятся схемы данных и алгоритмов.
В конструкторской части проводится анализ возможных конструкторских решений,
которые могут быть использованы для реализации ПМ ГИНЗА, проводится анализ и выбор
языков программирования и интегрированных сред разработки, описан анализ и выбор
системы контроля версий, определены требования к надёжности, составу и параметрам
технических средств, определены требования к программной совместимости, приведен
обзор пользовательского интерфейса.
6
В технологическом разделе содержатся сведения о методике создания данного
программного модуля, приводится подробное описание используемых технологий,
шаблоны проектирования, сведения о методах и результатах отладки и тестирования
разрабатываемого программного модуля.
Объем пояснительной записки составляет 89 листов.
Результаты работы апробированы на 9-ой Всероссийской научно-практической
конференции «Актуальные проблемы информатизации в науке, образовании и экономике»2016, и на 24-ой Всероссийской межвузовской научно-технической конференции студентов
и аспирантов «Микроэлектроника и информатика»-2017. Содержание и выводы работы
представлены в статье, принятой для публикации изданием «Известия высших учебных
заведений. Электроника», включенным в список журналов рекомендованных ВАК
Министерства образования и науки РФ. Основные положения работы докладывались на
Всероссийском конкурсе проектов и разработок в области IT-технологий «IT-прорыв»
сезона 2016-2017. Апробация практической части ВКР подтверждается внедрением
результатов ВКР в деятельность предприятия АО «ЭЛВИС-НеоТек».
7
1. ИССЛЕДОВАТЕЛЬСКИЙ РАЗДЕЛ
1.1. Актуальность выбранной темы
В настоящее время крайне актуальна задача автоматической идентификации
автомобиля по снимку. Это применяется как для учета въезда машин на охраняемые
территории, так и для регистрации нарушений правил дорожного движения.
Один из важных аспектов распознавания заключается в том, что алгоритмы
распознавания государственных регистрационных знаков автотранспорта должны быть
устойчивы к искажениям изображений номерных пластин, связанным со скоростью
движения автомобилей и положением камеры относительно номерного знака [7].
Также ещё одной из проблем распознавания автомобильных номеров является
разнообразие их типов, отличающихся начертанием символов, фоном или размером
номерных пластин. Данные для машинного обучения должны включать большое
количество изображений номеров разных типов [6]. Однако, не всегда есть возможность
получить в короткие сроки несколько тысяч изображений, необходимых для обучения
нейронной сети.
Для решения описанных проблем, а также для уменьшения количества ручной
обработки, был разработан генератор, который получает изображения номерных пластин
автомобилей по заданному стандарту.
1.2. Исследование предметной области
Рассмотрим процесс распознавания автомобильного номера подробнее. Он состоит и
пяти этапов:
поиск номерного знака на фотографии (рис. 1.1, а — выровненная область с номерной
пластиной расположена в левом нижнем углу);
выделение на полученном снимке символов номера (рис. 1.1, б);
выделение границ символов и разбиение номера на символы (рис. 1.1, в);
распознавание каждого из символов (рис. 1.1, г — символы, классифицированные с
невысокой вероятностью — больше 50% и меньше 60%, выделяются красным);
оценка надежности распознавания каждого символа.
8
а)
б)
в)
г)
Рис. 1.1. Поиск номерной пластины на фотографии (а), выделение на снимке номера
автомобиля (б), выделение границ символов номера и разбиение изображения номера на
символы (в), распознавание каждого из этих символов (г)
Наиболее эффективным способом распознавания автомобильных номеров по
фотографиям, сделанным с камеры, является использование сверточных нейронных сетей
[7]. На вход сети при этом подаётся не изображение номера целиком, а нарезанные с этого
изображения символы номера.
9
Суть метода распознавания изображений заключается в том, чтобы определить к
какому классу или категории относится объект. Обучение алгоритма распознавания состоит
из обучения классификаторов – SVM (Support Vector Machine) [10]. После того как все
изображения разбиты на конечное количество классов, целью алгоритма распознавания
является определение к какому из классов отнести распознаваемый объект. При
распознавании изображений, изображение разбивается на некоторые количественные
измерения. Объединение этих измерений называется вектором признаков изображения. При
распознавании изображений, на вход классификатору подаются вектора признаков.
Классификатор сравнивает эти вектора признаков с векторами, сформированными в
результате обучения алгоритма для каждого из возможных символов номера – классов [11].
Работа классификатора заключается в построении функции, которая для каждого вектора
признаков определяет к какому классу принадлежит объект. При обучении строится
несколько различных классификаторов с целью повысить точность распознавания.
После
классификации
каждого
символа
оценивается
надежность
этой
классификации. Оценка того, что весь номер распознан верно, складывается из
вероятностей верного распознавания отдельных символов. Классификаторы возвращают
вектор вещественных значений по одному для каждого класса (символа) и чем больше
значение выхода у класса-победителя, тем надёжнее решение.
До
настоящего
времени
для
обучения
рассматриваемой
нейронной
сети
использовались фотографии, полученные с помощью реальных съёмок автомобилей. Эти
фотографии отбирались и обрабатывались вручную, в частности, на каждом снимке должно
было находиться только одно изображение номерного знака. Кроме того, имя каждого файла
должно было содержать номер, который изображен на фотографии.
Для машинного обучения требуется большая выборка данных. Правильная ручная
разметка этих данных играет важную роль для качественного обучения нейронной сети.
После сбора необходимого количества изображений, они очищаются от шумов – из выборки
удаляются фотографии на которых плохо виден номерной знак, которые содержат более
одного автомобильного номера или не содержат ни одного номера. Затем все изображения
приводятся к одинаковому формату. После этого начинается самый сложный этап – ручная
разметка изображений. В данном случае разметка представляет собой правильное
именование обучающих данных, то есть имя каждой фотографии должно содержать номер
автомобильного знака, представленного на изображении, а также индекс или порядковый
10
номер изображения в выборке (индекс необходим для исключения файлов с одинаковыми
именами, т.к. в выборку могли попасть фотографии одной и той же машины).
Таким образом, использование фотографий, полученных с помощью реальных
съёмок, приводит к большим затратам времени на создание обучающей выборки, к тому же
неэффективно и дорого дообучать нейронную сеть из-за постоянного изменения
существующих и добавления новых стандартов, описывающих автомобильные номера. Для
решения этих проблем, а также для уменьшения количества ручной обработки, был
разработан генератор синтетической обучающей выборки.
1.3. Цель и задачи разработки
Целью разработки является генерация синтетической обучающей выборки для
нейронной сети, распознающей государственные регистрационные знаки автомобилей.
Рассматриваемый программный модуль ПМ ГИНЗА позволит существенно сократить время
создания обучающей выборки и повысить эффективность обучения нейросети.
Для достижения поставленной цели необходимо выполнить следующие задачи:
исследовать процесс создания перспективно преобразованных изображений;
провести сравнительный анализ существующих программных решений для создания
проективно преображенных изображений;
выбрать инструментальные средства разработки;
выбрать среду разработки;
определить требования к составу выполняемых функций ПМ ГИНЗА;
определить требования к надёжности и программной совместимости ПМ ГИНЗА;
определить требования к информационной и программной совместимости ПМ
ГИНЗА;
разработать схему данных ПМ ГИНЗА;
разработать схему алгоритма ПМ ГИНЗА;
выбрать методы отладки и тестирования ПМ ГИНЗА;
разработать ПМ ГИНЗА;
провести отладку и тестирование ПМ ГИНЗА.
11
1.4. Математическая модель геометрических искажений номера
ПМ ГИНЗА должен генерировать искаженные изображения номерных пластин.
Искажения связаны со скоростью движения автомобилей и положением камеры
относительно номерного знака. Рассмотри два основных метода искажения изображений:
аффинное преобразование и перспективное преобразование изображений [13].
1.4.1. Аффинные и перспективные геометрические преобразования
В настоящее время для изменения и преобразования изображений разработано две
основных математических теории:
аффинная геометрия [12];
перспективная геометрия [13].
Основным отличием теорем аффинной и перспективной геометрии является
параллельность прямых: в аффинной геометрии, как и в Евклидовой, прямые исходного и
преобразованного изображений параллельны; в перспективной геометрии, в общем случае,
данные прямые не являются параллельными.
Рассмотрим более подробно обе теории.
а) Аффинная геометрия
Аффинные
преобразования
представляют
собой
совокупность
линейных
преобразований [12]. Например, к аффинным преобразованиям можно отнести поворот
объекта или его перенос в плоскости. Объекты, искажённые при помощи аффинного
преобразования, обладают следующими свойствами:
все прямые линии, соответствующие исходному объекту остаются прямолинейными;
прямые линии являются параллельными с соответствующими линиями исходного
объекта;
сохраняется пропорциональность отрезков с исходным объектом.
Основными операциями аффинной геометрии над изображениями в двумерной
системе координат являются:
перемещение (сдвиг) изображения в плоскости (рис. 1.2, а);
12
уменьшение или растяжение изображения (рис. 1.2, б);
скос изображения (рис. 1.2, в);
поворот изображения относительно начала системы координат (рис. 1.2, г);
симметричное отражение изображения (рис. 1.3.);
Рис. 1.2. Аффинные преобразования: сдвиг (а), растяжение (б), скос (в)
Рис. 1.3. Симметричное отражения изображения
Основной отличительной особенностью аффинной геометрии является изменение
длины прямых, образующих исходное и преобразованное изображения [14]. С точки зрения
аффинной геометрии любые два объекта: исходный и подвергнутый аффинному
преобразованию – считаются равными. То есть, в аффинной геометрии, исходное и
растянутое изображения эквивалентны друг другу, при этом соответствующие прямые этих
13
объектов имеют разную длину. Отсюда можно сделать вывод, что в рамках аффинной
геометрии, расстояния между соответствующими точками исходного и преобразованного
изображений не имеет значения. Аналогичные рассуждения применимы и к углам, их
величина может отличаться в исходном и преобразованном изображениях. Таким образом,
понятия равностороннего, равнобедренного и прямоугольного треугольника не существуют
в аффинной геометрии, в ней есть только понятие – треугольник.
ПМ ГИНЗА должен симулировать изменение положения камеры относительно
изображения автомобильного номера в трёхмерном пространстве. И в связи с тем, что
аффинные преобразования представляют собой лишь элементарные геометрические
преобразования: сдвиг, масштабирование, скос, вращения – они не могут быть
использованы для решения поставленной задачи.
б) Перспективная геометрия
Перспективные
преобразования
представляют
собой
преобразования
двух
трёхмерных пространств друг в друга [13]. Объекты, искажённые при помощи
перспективного преобразования, в отличие от искажённых при помощи аффинного
преобразования, обладают следующими свойствами:
все прямые соответствующие параллельным прямым исходного объекта, в общем
случае, являются сходящимися;
при уменьшении расстояния от объекта до центра его проецирования, размер данного
объекта увеличивается;
линии исходного объекта искажаются в зависимости от положения точки обзора
объекта и расстояния от неё до объекта.
Поскольку перспективные преобразования являются преобразованиями в трёхмерной
системе координат, для просмотра изображений в двумерной системе координат (например,
на экране монитора), необходимо делать проекцию изображения из трёхмерного
пространства в двумерное. Полученные таким образом изображения, называются
перспективными преобразованиями в плоскости.
Для перспективного преобразования изображений можно воспользоваться двумя
различными подходами. Первый подход заключается в том, что:
14
точка обзора или точка, относительно которой будет осуществляться проекция
объекта на плоскость, является неподвижной;
плоскость, на которую проецируется объект, является перпендикулярной к каждой
прямой, которая проходит через точку, относительно которой осуществляется
проекция, и каждую точку объекта.
Пример данного подхода к перспективному преобразованию объектов представлен на
рис. 1.4.
Рис. 1.4. Проекция объекта на плоскость при фиксированной точке обзора
Второй подход перспективного преобразования изображений заключается в том, что:
объект, который проецируется на плоскость, является неподвижным;
15
точка, относительно которой будет осуществляться проекция объекта на плоскость
(центр проекции), может произвольно менять положение в трёхмерной системе
координат;
плоскость, на которую проецируется объект, может не являться перпендикулярной к
линии взгляда (рис. 1.5).
Пример данного подхода к перспективному преобразованию объектов представлен на
рис. 1.5.
Рис. 1.5. Проекция объекта на плоскость при фиксированном объекте
Первый из рассмотренных способов перспективного преобразования изображений
похож на действия человека, описывающего маленький объект, например, книгу. Для того,
чтобы составить это описание, человек начнёт переворачивать и вращать книгу в руках в
разные стороны. В приведённом примере точка обзора (проекции) является неподвижной, а
вот
объект
перемещается.
Второй
из
рассмотренных
способов
перспективного
преобразования изображений похож на действия человека, описывающего большой объект,
например, машину. Для того, чтобы составить это описание, человек начнёт обходить
16
машину с разных сторон и залезать под неё. В приведённом примере точка обзора
(проекции) изменяет положение в пространстве, а вот объект является неподвижным.
ПМ ГИНЗА формирует изображения, которые отображаются на экране компьютера.
При отображении изображений на мониторе точка обзора, как правило, является
неподвижной, а сам монитор имеет перпендикулярное положение к линии взгляда
пользователя. В связи с этим, для реализации искажений изображений ПМ ГИНЗА был
выбран метод перспективного преобразования изображений, а для преобразования
трёхмерного изображения в двумерное, выбран подход, с фиксированной точкой обзора
(рис. 1.4).
1.4.2. Перспективные геометрические искажения номерных знаков
Для
реализации
искажения
изображений
выбран
метод
перспективного
преобразования с помощью матриц поворота. Перспективное преобразование изображений
применяется для симуляции равномерного изменения положения камеры относительно
номерной пластины в трехмерном пространстве. Проективное искажение изображений
осуществляется с помощью матрицы перспективного преобразования, которая содержит
информацию об углах поворота изображения и смещениях вдоль осей декартовой системы
координат.
Матрица перспективного преобразования изображения в трехмерном пространстве
создается путём перемножения нескольких матриц. Сначала изменяется масштаб
изображения в плоскости XY и центр изображения смещается в начало декартовой системы
координат [13] (рис. 1.6).
17
Рис. 1.6. Перспективное преобразование в системе с двумя координатными системами
Матрица такого преобразования имеет следующий вид:
𝑤
𝑤
0 −
𝑤′
2
ℎ
ℎ ,
𝑆=
0
−
ℎ′
2
[0 0
1 ]
(1)
где (w, h) – ширина и высота исходного изображения, а (w’, h’) – масштабированного.
После переноса центра изображения в центр системы координат симулируется
поворот камеры относительного номерного знака. Изображение поворачивается в
трёхмерном пространстве вокруг осей 𝑥, 𝑦, 𝑧 на углы 𝛼, 𝛽, 𝛾 соответственно. Влияние
компонент 𝛼, 𝛽, 𝛾 на искажение изображения номерной пластины показано на рис. 1.7.
Рис. 1.7. Поворот изображений вокруг осей x, y, z на углы: (а) α, (б) β, (в) γ
соответственно
18
Поворот изображения вокруг оси X (рис. 1.7, а) в плоскости XY осуществляется при
помощи матрицы:
1
(
)
𝑅𝑥 𝛼 = [0
0
0
cos(𝛼 )
sin(𝛼)
0
− sin(𝛼)].
cos(𝛼)
(2),
Поворот изображения вокруг оси вокруг Y (рис. 1.7, б) в плоскости XY производится
с помощью матрицы:
cos(𝛽)
𝑅𝑦 (𝛽) = [
0
− sin(𝛽)
0
1
0
sin(𝛽)
0 ].
cos(𝛽)
(3)
Матрица поворота изображения вокруг оси Z (рис. 1.7, в) в плоскости XY имеет
следующий вид:
cos(𝛾 )
𝑅𝑧 (𝛾 ) = [ sin(𝛾 )
0
Вращение
изображения
номерной
− sin(𝛾 )
cos(𝛾 )
0
0
0].
1
пластины
в
(4)
трехмерном
пространстве
осуществляется при помощи матрицы R, которая получается путем последовательного
перемножения матриц 𝑅𝑥 , 𝑅𝑦 , 𝑅𝑧 :
R = 𝑅𝑥 (𝛼) ∗ 𝑅𝑦 (𝛽) ∗ 𝑅𝑧 (𝛾).
(5)
Перемещения камеры на смещения ∆𝑥, ∆𝑦, ∆𝑧 относительно начала координат
характеризуются матрицей:
1
𝑇 = [0
0
0
0 0 ∆𝑥
1 0 ∆𝑦
𝐸
]=[
0
0 1 ∆𝑧
0 0 1
∆
],
1
(6)
где
𝐸 – единичная матрица;
∆𝑥
∆ = [∆𝑦] – вектор столбец приращений.
∆𝑧
Далее камера удаляется от изображения номерного знака на расстояние 𝑓.
Одновременно с отдалением камеры от номера, изображение номерного знака
19
перемещается в плоскости XY в начало декартовой системы координат (процесс
аналогичный представленному на рис. 1.6) при помощи следующей матрицы:
С=
где 𝑓
𝑓
0
0
𝑓
[0
0
𝑤
2
ℎ ,
−
2
1 ]
−
(7)
≈ 2𝑡𝑔𝑤(𝑤) характеризует удалённость камеры от изображения.
2
В результате матрица перспективного преобразования изображения в трехмерном
пространстве определяется следующей формулой:
C∗T∗R∗𝑆 =(
𝐶
0
0
𝐸
)∗(
1
0
∆
𝑅
)∗(
1
0
=(
𝐶
0
0
𝑆
)∗(
1
0
0
𝐸
)∗(
1
0
=(
0
)
1
∆
𝑅𝑆
)∗(
1
0
𝐶
0
0
)=
1
0
𝐸𝑅𝑆
)∗(
1
0
∆
𝐶𝐸𝑅𝑆
)=(
1
0
𝐶∆
).
1
(8)
Использование для искажения изображений полученной матрицы позволяет
эффективно имитировать все возможные варианты положения камеры относительно
номерной пластины, что позволяет генерировать реалистичную обучающую выборку.
1.5. Обзор существующих программных решений
На основании приведённых ранее исследований был проведён сравнительный обзор
существующих
преобразованные
программных
изображения.
решений,
В
которые
качестве
могут
объектов
создавать
перспективно
исследования
принимаются
следующие программы:
Adobe Photoshop [16];
GIMP [17];
Unity [18].
Перечисленные программные решения были выбраны так как являются наиболее
функциональными и распространёнными.
20
1.5.1. Графический редактор Adobe Photoshop
Adobe Photoshop — многофункциональный графический редактор [16]. Графический
редактор признан лидером рынка по части коммерческих средств, предназначенных для
редактирования растровых изображений.
В Photoshop реализована функция поворота объекта в трёхмерной системе координат:
три перпендикулярных друг другу оси, исходящие из одной точки. Данная функция
позволяет легко вращать объекты в трёхмерном пространстве.
Однако, Adobe Photoshop — это сложная программа для пользователей, которые
только начинают с ней работать. Сложность заключается не в освоении этой программы, а
в её многозадачности. Поскольку Photoshop является универсальной программой для работы
с растровой графикой, он содержит много инструментов для решения различных задач.
Непонимание многих из этих инструментов и их назначения пугает любого неопытного
пользователя. Интерфейс этого графического редактора представлен на рис. 1.8.
Рис. 1.8. Графический интерфейс Adobe Photoshop
Кроме того, Adobe Photoshop не позволяет автоматизировать процесс создания
изображений,
обеспечивать
равномерность
распределения
символов
номеров
автомобильных знаков и задавать равномерность углов поворота камеры относительно
изображения.
21
1.5.2. Графический редактор Gimp
Gimp (GIMP — GNU Image Manipulation Program) — кроссплатформенное
программное обеспечение, назначение которого состоит в редактировании изображений
[17]. Графический редактор GIMP многофункционален, в том числе, он включает функцию
перспективного преобразования изображений в трёхмерном пространстве.
Одно из достоинств графического редактора GIMP — доступность из большого числа
источников в различных операционных системах, например, Microsoft Windows, GNU/Linux
или Mac OS. GIMP является свободно распространяемым программным обеспечением и
выпускается под лицензией GPL (General Public License).
Интерфейс этого графического редактора представлен на рис. 1.9.
Рис. 1.9. Графический интерфейс GIMP
Программа GIMP достаточно проста в освоении и имеет хорошую и подробную
онлайн-документацию. Пользоваться ей без труда сможет пользователь любого уровня
подготовки. Однако, GIMP не позволяет автоматизировать процесс создания изображений,
22
обеспечивать равномерность распределения символов номеров автомобильных знаков и
задавать равномерность углов поворота камеры относительно изображения.
1.5.3. Платформа для создания приложений Unity
Unity — очень популярная гибкая и мощная платформа разработки, предназначенная
для создания многоплатформенных 2D- и 3D-приложений [18].
Данная программа доступна для операционных систем Windows и OS X. Однако, для
новичка Unity сложен в освоении, поскольку практически всё делается через код и движок
оснащен собственным редактором кода. К тому же, Unity распростаняется в нескольких
версиях — бесплатная версия, в которой ограничены возможности графики, и Pro версия,
стоимость которой равна 1500$ в год. Интерфейс Unity представлен на рис. 1.10.
Рис. 1.10. Графический интерфейс 3D-движка Unity
С помощью Unity можно создать видеоролик, в котором сымитировать движение
автомобиля или равномерное изменение положения камеры относительно автомобиля, и
вставлять в этот ролик различные изображения номерных знаков. Полученные таким
образом видеоролики можно нарезать на кадры. Это позволит задать равномерность углов
поворота камеры относительно изображений. Однако, Unity не позволяет обеспечить
23
равномерность
распределения
символов
номеров
автомобильных
знаков
и
автоматизировать процесс подстановки изображений в созданный видеоролик.
Сравнение выбранных аналогичных существующих решений, описанных выше,
проводилось по восемнадцати параметрам, начиная от понятности пользовательского
интерфейса, сложности освоения, заканчивая доступностью из различных источников,
доступностью для разных операционных систем и стоимостью лицензии. В конечном итоге
все параметры были объединены в семь наиболее важных групп, и по каждому из них были
сделаны конечные выводы.
Параметрами исследования являются следующие факторы:
сложность освоения новым пользователем;
автоматизация процесса создания изображений;
равномерность углов поворота камеры относительно изображения;
равномерность распределения символов номера;
трудозатраты на добавление новых фильтров обработки изображений;
средняя скорость создания изображений;
стоимость лицензии.
Для того, чтобы проанализировать сложность освоения рассматриваемых программных
решений новым пользователем, производилась оценка фокус-группой (восемь человек) –
это группа потенциальных пользователей, которые не знакомы с оцениваемым ими
интерфейсом.
Для того, чтобы проанализировать среднюю скорость создания изображений в
рассматриваемых
программных
решениях,
хронометрировалась
работа
оператора.
Оператор имел опыт создания более двухсот перспективно преобразованных изображений
в каждом из рассматриваемых продуктов.
В результате анализа были сделаны следующие выводы: рассмотренные программные
решения
для
создания
автоматизировать
процесс
перспективно
создания
преобразованных
изображений
и
изображений
обеспечивать
не
могут
равномерность
распределения символов номеров автомобильного знаков на создаваемых изображениях.
Результаты анализа программных решений Photoshop, GIMP и Unity приведены в
таблице 1.1.
24
Таблица 1.1
Сравнительный анализ программных решений Photoshop, GIMP, Unity и ПМ ГИНЗА
Параметры
Сложность освоения
новым пользователем
Photoshop[1]
GIMP[2]
Unity[3]
ПМ ГИНЗА
Высокая
Средняя
Высокая
Низкая
Нет
Нет
Частичная
Есть
Нет
Нет
Да
Да
Вручную
Вручную
Вручную
Автоматически
При создании
При создании
При создании
каждого
каждого
каждого
изображения
изображения
изображения
До 3 шт в
До 3 шт в
Автоматизация
процесса создания
изображений
Равномерность углов
поворота камеры
относительно
изображения
Равномерность
распределения
символов номера
Трудозатраты на
добавление новых
фильтров обработки
изображений
Средняя скорость
создания изображений минуту
минуту
Стоимость лицензии
Не требуется
От 12$ в месяц
1 000 в минуту
Только на этапе
написания кода
100 000 в
минуту
От 35$ в месяц Не требуется
Источники информации:
1. Документация Adobe Photoshop. URL: http://www.adobe.com/ru/ /photoshop.html
2. Документация GIMP – GNU Image Manipulation Program. URL: https://www.gimp.org
3. Документация Unity Game Engine. URL: https://unity3d.com/ru
25
Результаты анализа программных продуктов Photoshop, GIMP и Unity показали, что
существующие программные решения не позволяют быстро формировать большую
выборку перспективно преображенных изображений с равномерными углами поворота
камеры относительно изображения в трёхмерном пространстве. Поскольку ни одно из
готовых решений не удовлетворяет в полной мере перечисленным требованиям, было
принято решение разработать ПМ ГИНЗА, полностью удовлетворяющий всем заявленным
требованиям.
1.6. Требования к составу выполняемых функций ПМ ГИНЗА
ПМ ГИНЗА должен обеспечить выполнение следующих функций:
создание изображения регистрационного номерного знака автомобиля в соответствии
со стандартами:
1) ГОСТ Р 50577-93 для номерных знаков РФ.
2) SI 5327 для номерных знаков Израиля.
3) СТ РК 986-2003 для номерных знаков Республики Казахстан.
генерацию изображений номерных знаков без искажений со случайными номерами с
равномерным распределением символов в каждой позиции;
симуляцию крепёжных болтов на изображении номерного знака;
«затенение» части номерной пластины;
генерацию из каждого не искажённого изображения случайного номерного знака
проективно преображенных изображений;
сохранение сгенерированных изображений.
1.7. Организация входных и выходных данных ПМ ГИНЗА
Входные данные представляют собой три параметра:
путь к директории для сохранения сгенерированных изображений;
индекс нужного для генерации вида номерного знака (описание индексов
представлено в Приложении 4);
количество генерируемых перспективно преобразованных изображений номерных
знаков со случайными номерами.
26
Входная информация должна вводиться пользователем одним из двух способов.
Первый способ – использование графического пользовательского интерфейса. Второй
способ – с помощью интерфейса командной строки, указав параметры запуска в форме:
<директория> <индекс> <количество>.
Выходные
данные
для
ПМ
ГИНЗА
представляют
собой
перспективно
преобразованные изображения номерных знаков автомобилей, со случайными символами
номера. Сгенерированные изображения сохраняются в формате JPEG с эталонным именем
(имя должно содержать номер автомобильного знака, представленного на изображении).
1.8. Алгоритм и структура данных ПМ ГИНЗА
Рассмотрим подробнее схему данных ПМ ГИНЗА, она представлена на рис. 1.11.
Рис. 1.11. Схема данных ПМ ГИНЗА
В качестве входных данных программе поступают введённые пользователем
параметры:
директория
для
сохранения
сгенерированных
изображений,
индекс
генерируемого вида номерных знаков (описание индексов представлено в Приложении 4) и
количество генерируемых изображений. Помимо этого, в ходе работы ПМ ГИНЗА
27
считывает параметры перспективного преобразования изображений из конфигурационного
файла настроек — default_params.ini, поставляемого вместе с программным модулем
(описание структуры конфигурационного файла приведено в Приложении 5).
Рассмотрим подробнее алгоритм [19] генерации изображений номерных знаков
автомобилей для формирования синтетической обучающей выборки.
Схема алгоритма ПМ ГИНЗА представлена на рис. 1.12.
Рис. 1.12. Схема алгоритма ПМ ГИНЗА
28
Вначале ПМ ГИНЗА создается шаблон изображения номерной пластины. Затем
генерируются изображения номерных знаков со случайными номерами с равномерным
распределением символов в каждой позиции (рис. 1.13, а). Количество генерируемых
изображений задано пользователем. Полученные изображения сохраняются. Далее
производится симуляция крепежных болтов на изображениях номерных знаков (рис. 1.13,
б). Вновь полученные изображения также сохраняются.
a)
б)
в)
Рис. 1.13. Шаблон номерного знака со случайным номером (а), симуляция крепежных
болтов (б) и проективное преобразование полученного изображения (в).
Далее
каждое
из
созданных
изображений
подвергается
проективному
преобразованию с помощью матриц поворота (рис. 1.13, в), которое описано в разделе 1.4.2.
Положение камеры относительно номерной пластины в трёхмерном пространстве
изменяется равномерно. Автосгенерированные изображения сохраняются с эталонным
именем (имя содержит номер автомобильного знака, представленного на изображении).
1.9. Перспективы развития
ПМ ГИНЗА может быть использован как генератор обучающих выборок для
нейросетевых алгоритмов распознавания государственных регистрационных номерных
знаков автомобилей. К тому же, ПМ ГИНЗА применяется в АО «ЭЛВИС-НеоТек» для
автоматизации и повышения скорости создания обучающих выборок для нейронных сетей.
29
Выводы
В
ходе
работы
над
исследовательским
разделом
данной
выпускной
квалификационной работы была исследована предметная область, изучена математическая
модель геометрических искажений номера, поставлены цель и задачи. Также были
проанализированы и изучены существующие программные решения, позволяющие
создавать
перспективно
преобразованные
изображения,
описаны
функциональные
требования и требования к входным и выходным данным, разработаны схема алгоритма ПМ
ГИНЗА и схема данных.
30
2. КОНСТРУКТОРСКИЙ РАЗДЕЛ
2.1. Выбор инструментальных средств разработки
Для разработки ПМ ГИНЗА необходимо:
выбрать язык программирования;
выбрать среду разработки со встроенным отладчиком;
выбрать систему контроля версий.
2.1.1. Выбор языка программирования
Поскольку для работы ПМ ГИНЗА требуется проведение большого количества
вычислений, необходимо выбрать такой язык программирования, который позволит
достичь высокой производительности. Также для разработки ПМ ГИНЗА требуется язык с
поддержкой объектно-ориентированной методологии программирования, позволяющей
реализовывать более гибкие программные решения. Ещё одним критерием выбора языка
является его распространённость, которая обеспечивает широкий набор ресурсов для поиска
дополнительной информации в случае возникновения ошибок или поиска лучших
программных и архитектурных решений. В качестве объектов исследования были выбраны
языки программирования, удовлетворяющие перечисленным требованиям, а именно: C++
[20], C [21], Java [22], C# [23] и Python [24].
а) Язык программирования C++
Язык программирования C++ разработан в начале 80-х годов сотрудником «Bell
Laboratories» Бьерном Страуструпом [20]. Язык С++ иногда называют улучшенным языком
С, потому что он обеспечивает перегрузку функций, контроль типов и ряд других
возможностей. Но главное отличие C++ в том, что он добавляет к С объектную
ориентированность. С++ был стандартизирован в 1998 году Международной организацией
стандартизации под номером 1488:1998 — Язык программирования С++.
Стандартная библиотека языка С++ содержит распространённые контейнеры и
алгоритмы, средства ввод-вывод, регулярные выражения, многопоточность и другие
31
возможности. В C++ сочетаются свойства как высокоуровневых, так и низкоуровневых
языков.
Синтаксис C++ унаследован от языка C. Среди новых возможностей можно выделить
пространства имен, классы (полиморфизм, инкапсуляция, наследование, виртуальные
функции, функции-члены, абстрактные классы и конструкторы, и т.д.), перегрузку
операторов, шаблоны, обработку исключений и многое другое.
C++ широко используется при разработке различного программного обеспечения, а
также является одним из самых известных и востребованных языков программирования.
б) Язык программирования C
Язык программирования C был разработан Кеном Томпсоном и Деннисом Ритчи в
начале 70-х годов [21]. Первоначальная реализация С была для создания операционной
системы UNIX. Затем, язык С был перенесен на многие другие платформы и существует
независимо от них. Программы, написанные на С, близки по скорости выполнения к языку
ассемблера.
Язык С широко применяется для создания системного программного обеспечения, и
является мощным средством для решения трудных задач и создания сложных программных
решений. Программы, написанные на языке C, переносимы на любую платформу либо с
минимальными изменениями, либо вовсе без них.
Язык C вложил существенный вклад в развитие программного обеспечения.
Синтаксис этого языка был заложен в основу таких языков программирования как C++, PHP,
Java, C# и других.
в) Язык программирования Java
Язык Java является объектно-ориентированным языком программирования.
Java
начал разрабатываться компанией Sun Microsystem в 1991, а официальный выпуск состоялся
23 мая 1995 года [22]. Первоначально данный язык назывался Oak и предназначался для
использования в бытовой электронике, но в дальнейшем язык переименовали в Java и стали
использовать для написания приложений и серверных программных решений.
Java-программы сначала переводятся в байт-код, этот байт-код необходим для
запуска на виртуальной Java- машине (JVM — Java Virtual Machine). JVM обрабатывает
байт-код и передает инструкции оборудованию. Тем самым пропадает необходимость в
32
сборке программы под каждую платформу в отдельности, главное, чтобы существовала
JVM для соответствующей платформы. Так же можно отметить гибкую систему
безопасности: любые операции, превышающие установленные полномочия программы
(такие как несанкционированный доступ к данным или соединение с другим компьютером),
вызывают ее прерывание. Однако главным недостатком концепции виртуальной машины
считают снижение производительности.
г) Язык программирования C#
C# — объектно-ориентированный язык программирования. C# был разработан в 2000.
Изначально C# был частью MS .Net Framework, однако, позже язык стандартизировался как
ISO/IEC 23270 [23].
C# относится к семье языков с С-подобным синтаксисом, он близок к С++ и Java. Для
снижения возможности внесения ошибок в код, в С# введен механизм сборки мусора,
который освобождает программиста от необходимости ручной очистки памяти. В С#
отсутствуют
глобальные переменные, множественное наследование (вместо него
допускается множественное наследование интерфейсов). Зато, в С# существует поддержка
полиморфизма, имеется статическая типизация, поддерживается перегрузка операторов,
обобщенные типы, итераторы, анонимные функции, исключения и другие возможности.
В С# запрещено прямое манипулирование памятью, но платформа Microsoft .NET
предоставляет взамен многофункциональный сборщик мусора и большое количество типов
данных. Преобразования типов в языке C# отличаются от преобразований в языке С++, это
выражается, например, в том, что все преобразования должны быть только явными. К тому
же, все преобразования типов могут быть только безопасными (неявные преобразования или
указатели в виде целых переменных не допускаются).
г) Язык программирования Python
Python – язык программирования высокого уровня, широко применяемый как
интерпретируемый объектно-ориентированный язык [24].
Python поддерживает динамическую типизацию, автоматическое управление
памятью и структурами данных высокого уровня: словарями (хэш-таблицами), списками,
кортежами. Среди основных возможностей Python можно выделить классы, наследование,
полиморфизм, инкапсуляция, модули, перегрузку операторов, статические методы и классы,
33
обработку исключений и многопоточные вычисления. Синтаксис у языка Python прост и
выразителен. Python поддерживает и одновременно совмещает три подхода к написанию
кода: процедурный, объектно-ориентированный и функциональный.
Python обладает многофункциональной стандартной библиотекой. Большое число
модулей,
работающих
с
различными
операционными
системами,
делает
язык
кроссплатформенным. Помимо этого, Python умеет поддерживает регулярные выражения,
разные кодировки текста, содержит мультимедийные средства, работает с архивами, имеет
функционал для написания юнит-тестов и др.
В результате исследования рассмотренных языков была создана сравнительная
таблица 2.1.
Таблица 2.1
Сравнительный анализ языков программирования C++, C, Java, C# и Python
Язык
Характеристики
С++[1]
C[1]
Java[2]
C#[3]
Python[4]
+
−
+
+
+
Возможность компиляции в
машинный код
+
+
−
−
+
Поддержка обработки
исключений
+
−
+
+
+
Статическая типизация
+
+
+
−
−
Кроссплатформенность
+
+
+
+
+
Опыт использования
+
+
+
+
−
Возможность подключения
существующих на предприятии
+
−
−
−
+
Поддержка объектноориентированного подхода
готовых решений
34
Источники:
1. C++ reference. URL: http://en.cppreference.com/w/cpp
2. Документация Java. URL: https://docs.oracle.com/javase/8/ http://java.net/
3. C# Reference. URL: https://msdn.microsoft.com/en/library/618ayhy6.aspx
4. Документация Python. URL: https://www.python.org/doc/
Условные обозначения:
+ - возможность присутствует
– - возможность отсутствует
По результатам анализа для реализации ПМ ГИНЗА выбран язык С++.
Язык С++ [20] выбран из-за его высокой производительности, так как одним из
основных критериев выбора языка программирования для реализации ПМ ГИНЗА является
производительность. Язык С++ обладает производительностью, аналогичной языку С и
ассемблеру, но требует значительно меньше времени на разработку по сравнению с ними.
Такие языки программирования высокого уровня, как Python, Java и C#, обладают
значительно меньшей производительностью и не позволяют компилировать исходный код
в машинный код.
2.1.2. Описание используемых библиотечных средств
Помимо
стандартных
средств,
предоставляемых
выбранными
языками
программирования, в ходе разработки ПМ ГИНЗА использовались сторонние библиотеки,
написанные на языках С++\С, такие как:
Boost Filesystem [25] для расширения функционала работы с файловой системой.
OpenCV [26] для обработки изображений и решения задач компьютерного зрения.
а) Boost C++ Filesystem Library – библиотека для работы с именами файлов
Библиотека Boost Filesystem предоставляет средства для расширения функционала
работы с файловой системой, файловыми путями, файлами и каталогами [25]. Boost
Filesystem создана для выполнения операций с файловыми путями, и написана на языке
программирования С++.
35
В случае, когда функции библиотеки Boost.Filesystem они не могут успешно
завершить
работу,
они
могут
генерировать
исключения.
Реализации
функций
библиотеки Boost.Filesystem могут использовать функции из стандартной библиотеки C++.
Ещё одним достоинством библиотеки Boost.Filesystem является кроссплатформенность.
Один и тот же синтаксис используется на разных операционных системах, и поведение кода
является достаточно переносимым. Точный контроль над операциями и обработка ошибок
позволяют использовать Boost.Filesystem для поддержки в сложных приложениях, где не
желательно бросать исключения.
б) OpenCV (Open Source Computer Vision Library) – библиотека обработки изображений
Библиотека OpenCV (Open Source Computer) является библиотекой алгоритмов
компьютерного зрения и обработки изображений с открытым кодом [26]. OpenCV написана
на языке программирования высокого уровня C++. Библиотека позволяет:
интерпретировать изображения;
калибровать камеры;
анализировать перемещения объекта;
устранять оптические искажения и шумы;
определять похожесть объектов и следить за ними;
определять форму объектов;
распознавать жесты и т.д.
Библиотека OpenCV — это совокупность типов данных, методов и классов,
позволяющих обрабатывать изображения. OpenCV является одной из самых популярных
библиотек обработки изображений благодаря открытому коду и возможности бесплатного
использования как в учебных, так и в коммерческих целях.
2.1.3. Выбор среды разработки
Поскольку
С++
является
одним
из
самых
распространённых
языков
программирования, для него существует большое количество интегрированных сред
разработки,
обладающих
различным
функционалом.
Поскольку
высокая
производительность является одним из главных требований, предъявляемых к ПМ ГИНЗА,
важным критерием выбора среды для разработки ПМ ГИНЗА является наличие
36
профилировщика. В качестве объектов исследования были выбраны интегрированные
среды разработки MS Visual Studio [27], JetBrains Clion [28], Qt Creator [29], NetBeans [30] и
Eclipse SDK [31], как наиболее функциональные и распространённые
а) MS Visual Studio
Microsoft Visual Studio является интегрированной средой предназначенной для
разработки ПО, обладающей рядом дополнительных инструментальных средств [27].
Продукты MS Visual Studio позволяют разрабатывать консольные приложения, приложения
с графическим интерфейсом, веб-сайты, веб-приложения и веб-службы для платформ.
MS Visual Studio содержит встроенный инструмент для редактирования исходного
кода программы и позволяет производить рефакторинг кода. Встроенный в MS Visual Studio
отладчик работает имеет два уровня работы: уровень отладки исходного кода, и уровень
отладки машинного кода. Дополнительные встроенные инструментальные средства
содержат формы графического интерфейса и удобный редактор для создания приложений с
интерфейсами, содержат веб-редактор и редактор классов. Данная среда разработки
поддерживает возможность создания и подключения плагинов (дополнений), используемых
с целью расширения функционала. MS Visual Studio поддерживает системы контроля версий
исходного кода (например, Visual SourceSafe или Subversion), содержит множество
инструментов, позволяющих редактировать и проектировать код на предметноориентированных языках программирования.
б) JetBrains Clion
JetBrains CLion — умная интегрированная среда разработки программного
обеспечения, предназначенная для разработки приложений на языках С и С++ [28]. JetBrains
Clion позволяет разрабатывать программное обеспечение на платформах Windows, OS X и
Linux.
Многофункциональная среда разработки — JetBrains CLion включает в себя
встроенный отладчик, много шаблонов готового кода и интерфейс для работы с
популярными системами контроля версий (например, Subversion, Git, GitHub, Mercurial,
CVS,
Perforce
и
TFS).
CLion
предоставляет
возможности
автодополнения
и
автоформатирования кода, выполняет анализ кода на ленту с подсветкой потенциальных
проблем и предлагает способы их исправления, поддерживает систему сборки
37
кроссплатформенных проектов CMake, а также различные рефакторинги кода. JetBrains
CLion имеет большой репозиторий плагинов (дополнений) для расширения имеющейся
функциональности
в) Qt Creator
Qt Creator — полностью интегрированная среда разработки программного
обеспечения, которая содержит инструменты для проектирования и разработки сложных
приложений под разными операционными системами [29].
Qt Creator предназначен для разработки ПО на языке программирования C++. Также
для программирования на языке Python имеется PyQt, а для языка PHP — PHP-Qt.
Qt Creator интегрирован с кроссплатформенными системами автоматизации сборки:
qmake и CMake, содержит редактор кода Qt Designer, позволяющий проектировать и
собирать графические интерфейсы пользователя (GUI) из виджетов Qt. Данная среда
содержит много полезных инструментов, таких как поддержка систем управления версиями
(Subversion, Git, GitHub, Mercurial и CVS) и эмулятор Qt. Qt Creator содержит внутренний
отладчик для отладки обычных приложений на C++, а также включает возможность
подключить мобильные устройства к своему компьютеру и отлаживать запущенные на них
программы.
г) NetBeans
NetBeans IDE — свободная интегрированная среда разработки с открытым исходным
кодом для разработчиков программного обеспечения [30]. NetBeans предоставляет
множество различных инструментов для создания профессиональнго программного
обеспечения на языках программирования Java, C/C++, PHP, Python, JavaScriot, Groovy,
Ruby и ряда других.
Среда разработки NetBeans включает следующие возможности:
рефакторинг кода;
профилирование;
цветное выделение различных конструкций синтаксиса;
автоматическое дополнение при вводе различных конструкций;
большое количество шаблонов кода.
38
Перед началом создания приложений в интегрированной среде NetBeans, а также для
корректной работы данной среды предварительно должен быть установлен J2EE SDK или
Sun JDK требуемой версии.
NetBeans предоставляет средства для управления системами контроля версий с
помощью готовой интеграции Subversion, Mercurial и Git. Также с помощью редакторов и
функций перетаскивания в среде IDE можно быстро и эффективно разрабатывать
графические интерфейсы приложений.
г) Eclipse SDK
Eclipse SDK — свободная интегрированная среда разработки программного
обеспечения с открытым исходным кодом [31]. Eclipse SDK имеет большую разветвленную
систему плагинов (дополнений), которая обеспечивает работы среду с такими языками
программирования, как C, C++, PHP, Perl, Python, Ruby, Ada или COBOL.
Eclipse SDK позволяет создавать кроссплатформенное программное обеспечение для
Microsoft Windows, Mac OS X, Linux дистрибутивов и даже Solaris. Дання среда включает в
себя Eclipse Java development tools (JDT), содержащий компилятор Java. Программа
использует инструменты, которые образуют собой систему Eclipse Rich Client Platform.
Такая
система
помогает
разработчикам
создавать
мощные
функциональные
пользовательские приложения с красивым графическим интерфейсом на основе CSS
(Cascading Style Sheets — каскадные таблицы стилей). Интегрированная среда разработки
Eclipse SDK предоставляет Java IDE программу со всем необходимым набором
инструментов для разработки качественных приложений
В результате исследования рассмотренных сред разработки для программирования на
языке С++ была создана сравнительная таблица 2.2.
Таблица 2.2
Сравнительный анализ сред разработки для программирования на языке С++
Параметры
MS Visual
Studio[1]
JetBrains
Clion[2]
Qt Creator[3]
Eclipse
SDK[4]
NetBeans [5]
+
−
+
+
+
Редактор
пользовательского
интерфейса
39
Продолжение таблицы 2.2
Встроенный
+
−
−
−
−
Встроенный отладчик
+
+
+
+
+
Поддержка C++11
+
+
+
+
+
предприятии, наличие
лицензии
+
−
+
−
−
Опыт использования
+
−
+
+
−
Совместимость с
прежними проектами
+
−
+
−
−
профилировщик
Установленное ПО на
Источники:
1. Документация MS Visual Studio. URL: https://msdn.microsoft.com/library/1461a.aspx
2. Официальный сайт JetBrains Clion. URL: https://www.jetbrains.com/clion/
3. Официальный сайт Qt Creator. URL: https://www.qt.io/ide/
4. Официальный сайт Eclipse SDK. URL: https://eclipse.org/sdk/
5. Официальный сайт NetBeans. URL: https://netbeans.org
Условные обозначения:
+ - возможность присутствует
– - возможность отсутствует
Для разработки ПМ ГИНЗА была выбрана среда разработки Microsoft Visual
Studio. Среда разработки Microsoft Visual Studio была выбрана из-за того, что она обладает
рядом необходимых для данной разработки функций, таких как поддержка профилирование
кода на языке программирования С++, отладка и совместимость с прежними проектами.
40
2.1.4. Выбор системы контроля версий
Система управления версиями представляет из себя программное обеспечение,
облегчающее управление изменяющейся информацией [32]. Назначение систем управления
версиями заключается в хранении разных версий одного файла, фиксации изменений между
версиями этого файла и возможности возвращаться к более ранним версиям в случае
необходимости.
Системы управления версиями часто используются программистами с целью
поэтапного хранения версий программного разрабатываемого ПО.
В качестве объектов исследования были выбраны системы управления версиями CVS
[34], Subversion [35], Git [36] и Mercurial [37], как наиболее функциональные и
распространённые
а) Система контроля версий — CVS
CVS (Concurrent Versions System) — программный продукт из семейства систем
контроля версий [33]. В основе CVS лежит технология клиент-сервер, клиент и сервер
взаимодействовать либо по сети, либо располагаться на одной машине. Принцип работы
CVS следующий: наиболее поздняя версия и все предшествующие изменения хранятся в
репозитории сервера, клиенты же, когда подключаются к нему, проверяют отличие своей
(локальной) версии от версии сервера, если отличия есть, то они загружаются в локальный
репозиторий. При загрузке изменений могут возникнуть конфликты, после решения
которых, необходимые изменения вносятся в проект. Следующим шагом все изменения
загружаются в репозиторий сервера. В CVS является системой управления параллельными
версиями, она включает поддержку управления несколькими проектами одновременно и
возможность отката на предыдущие версии этих проектов [34].
К основным достоинствам данной системы управления версиями можно отнести
следующее:
возможность одновременной работы над общим проектом нескольких клиентов;
возможность управления не только одним файлом, но и всем проектом;
наличие огромного числа удобных графических интерфейсов;
41
Система CVS имеет широкое распространение и предустановлена в большинстве
операционных систем GNU/Linux. В данной системе при загрузке файлов с серверов
передаются только изменения, а не весь файл целиком.
К основным недостаткам данной системы управления версиями можно отнести
следующее:
перемещение или переименование файла, либо директории ведет к потере всех
изменений, связанных с ними;
сложность ведения параллельных веток одного проекта;
каждое изменение бинарного файла ведет сохранение всей версии файла;
при передаче отредактированных файлов с клиента на сервер файлы передаются
полностью.
На сегодняшний день, активная разработка CVS прекращена. Несмотря на наличие
более современных альтернативных систем контроля версий, избавившихся от недостатков
CVS, эта система является одной из самых распространенных, в частности, она широко
используется для небольших проектов, в которых не нужны параллельные версии, такие
проекты приходится периодически объединять.
б) Система контроля версий — Subversion
Subversion является свободной системой управления версиями. Официальный выпуск
был произведён компанией CollabNet в 2004 году [35]. Subversion содержит все важные
функции CVS, но в ней уменьшен ряд недостатков CVS (в частности, переименование или
перемещение файлов и каталогов, работа с двоичными файлами).
Subversion, аналогично CVS основывается на технологии клиент-сервер, и имеет
похожий принцип работы: клиенты загружают изменения из репозитория и сливают их со
своим проектом, конфликты локальных и серверных изменений решаются вручную.
К основным достоинствам данной системы управления версиями можно отнести:
аналогичность команд с CVS, что упрощает переход от одного к другому;
наличие графического интерфейса;
удобство работы с консоли;
возможность отслеживать историю изменения файлов и каталогов после их
переименования;
поддержка во многих средах разработки;
42
возможность создания копию репозитория;
возможность создания двух типов репозитория – базы данных или обычного набора
файлов;
удобный механизм создания веток проекта;
доступ к репозиторию можно получить через Apache по средствам протокола
WebDAV.
К основным недостаткам системы управления версиями – Subversion можно отнести
следующее:
хранение полной копии репозитория на локальном ПК в скрытых файлах,
занимающих достаточно большой объем памяти;
сложность
в
обработке
параллельного
переименования
файла
разными
пользователями;
сложность полного удаления файла и информации о нем из репозитория.
Subversion имеет широкое распространение среди разработчиков как открытого
программного обеспечения, так и закрытых и в корпоративных проектах. Subversion
обладает большим набором инструментов для удобного управления версиями проекта.
Простота и широкие возможности Subversion обеспечивают ей одну из лидирующих
позиций среди современных систем контроля версий.
Рассмотренные системы управления версиями — CVS и Subversion, относятся к
централизованным системам контроля версий, и представляют собой приложения типа
клиент-сервер, в котором репозиторий проекта существует в единственном экземпляре и
лежит на сервере. Доступ к репозиторию осуществлялся через специальное клиентское
приложение. Архитектура централизованной системы контроля версий представлена на
рис. 2.1.
43
Рис. 2.1. Архитектура централизованной системы контроля версий
в) Система контроля версий — Git
Git — распределенная система управления версиями, целью создания которой было
управление процессом разработки ядра Linux [36]. Git — это гибкая, распределенная
система контроля версий, которая дает много возможностей разработчикам программных
продуктов, для которых важно управление историей изменений.
Git позволяет обмениваться сохраненными данными с другими пользователями в
репозитории. В Git есть центральный репозиторий, с которым синхронизируются несколько
разработчиков, каждому из которых предоставляется локальная копия всей истории
разработки. При этом они могут скачивать обновления из центрального репозитория,
вносить свои правки, и загружать их обратно в центральный репозиторий.
Git обеспечивает быстрое разделение и слияние версий, работа над версией может
идти параллельно в нескольких ветках, которые затем достаточно легко могут частично или
полностью объединиться, уничтожиться, откатиться или разрастись в новые ветки проекта.
К основным достоинствам данной системы управления версиями можно отнести
следующее:
надежность системы сравнения ревизий и проверки корректности данных, благодаря
SHA1 алгоритму хеширования;
высокая производительность;
гибкость системы ветвления и слияния веток;
наличие локального репозитория с полной информацией об изменениях;
44
наличие графических оболочек для работы с Git;
возможность создания контрольных точек с полностью сохраненными данными, для
быстрого восстановления данных;
универсальность сетевого доступа по средствам использования HTTP, FTP, RSYNC,
SSH и других протоколов;
наличие качественной документации;
возможность интеграции с другими системами контроля версий;
гибкость системы, позволяющая настраивать ее под свои нужды и создавать
пользовательские интерфейсы на его базе.
К основным недостаткам системы управления версиями – Git можно отнести
следующее:
ориентированность на Unix-подобные операционные системы;
существует малая вероятность совпадения хеш-кода отличных по содержанию
ревизий;
изменения в проекте отслеживаются целиком, что неудобно при изменении не
связанных друг с другом файлов в большом проекте;
при первоначальном создании
репозитория может возникнуть долгая его
синхронизация с другими разработчиками.
Git является гибкой, мощной и очень удобной системой контроля версий. Он способен
удовлетворить потребности большинства пользователей. Его недостатки постепенно
удаляются и не приносят серьезных проблем.
г) Система контроля версий — Mercurial
Mercurial является многоплатформенной и распределенной система контроля версий.
Mercurial была создана для упрощения и ускорения работы с большими репозиториями кода
[37]. Создана Мэттом Макалом параллельно с системой Git. В основном Mercurial написана
на языке Python, а участки кода, требующие большой производительности — на С. Как и в
Git, идентификация ревизий происходит при помощи алгоритма хеширования SHA1, также
присутствует возможность присвоения им индивидуального номера. Аналогично с Git
имеется возможность создания и слияние веток проекта. Взаимодействия между клиентами
45
обеспечивается с помощью протоколов HTTP, HTTPS или SSH. Процесс работы в Mercurial
обычно следующий:
- создание на личном компьютере репозитория (новый или клонированный);
- операции по изменению, удалению, добавлению файлов в репозитории;
- фиксация (commit) изменений;
- повторение шагов 2 и 3;
- синхронизация изменений с другими репозиториями.
В Mercurial вся работа происходит в локальном репозитории и лишь при
необходимости производится отправка результатов работы в другие репозитории.
К основным достоинствам данной системы управления версиями можно отнести
следующее:
- быструю обработку данных, работу с несколькими ветками проекта;
- кроссплатформенную поддержку;
- возможность интеграции с системами контроля версий CVS, Subversion, Git, Bazaar,
Darcs и другими.
Основными недостатками Mercurial являются: как и в Git, возможность, что совпадёт
хеш-код разных ревизий и ориентированность на работу в консоли.
Простота интерфейса и набора команд, а также возможность импортирования
репозиториев из других систем делают переход на Mercurial достаточно простым.
Надежность и скорость работы позволяют использовать его в больших проектах, что делает
его достойным конкурентом проекта Git.
Рассмотренные системы управления версиями — Git и Mercurial относятся к
распределённым системам контроля версий [32]. Они позволяют хранить репозиторий и его
копии локально у каждого разработчика, пользующегося данной системой управления
версиями. В таких системах условно можно выделить центральный репозиторий, в который
отправляются изменения из локальных репозиториев, с ним же локальные репозитории
будут
синхронизироваться.
После
внесения
изменений
в
локальную
копию
пользователь отправляет изменения на сервер. Архитектура распределённой системы
контроля версий приведена на рис. 2.2.
46
Рис. 2.2. Архитектура распределённой системы контроля версий
В результате исследования рассмотренных систем управления версиями была
выбрана система Subversion. Клиентская часть выбранной системы управления версиями
называется TortoiseSVN.
TortoiseSVN представляет собой свободный клиент, поддерживаемый операционной
системой Windows, для системы контроля версий Subversion с открытым исходным кодом,
распространяемый под лицензией GPL [38]. TortoiseSVN обеспечивает управление файлами
и каталогами во времени. Файлы лежат в центральном хранилище, запоминающим любое
изменение, которое сделано в файлах и папках, хранящихся в репозитории. Это даёт
возможность восстанавливать более ранние версии файлов и анализировать историю их
изменения. Поэтому Subversion часто называют «машиной времени» для файловых систем.
2.2. Требования к составу и параметрами технических средств
Требования, которые предъявляются к техническим средствам [39] для работы с ПМ
ГИНЗА, представлены в таблицах 2.3 и 2.4.
47
Таблица 2.3
Минимальный состав необходимых для работы с ПМ ГИНЗА
технических средств и их характеристики
Процессор
IntelCore i3
Объём свободного места на жёстком диске
1 Гб
Оперативная память
1 Гб
Операционная система
Microsoft Windows 7 и выше
Разрешение экрана
1280 х 1024 пикселов
Компьютерная мышь
Интерфейс USB или PS/2
Клавиатура
101/102-х клавишная рус./лат.
Таблица 2.4
Рекомендуемый состав необходимых для работы с ПМ ГИНЗА
технических средств и их характеристики
Процессор
IntelCore i7
Объём свободного места на жёстком диске
2 Гб и более
Оперативная память
2 Гб
Операционная система
Microsoft Windows 7 и выше
Разрешение экрана
1280 х 1024 пикселов
Компьютерная мышь
Интерфейс USB или PS/2
Клавиатура
104/105-х клавишная рус./лат.
48
2.3. Требования к надежности ПМ ГИНЗА
ПМ ГИНЗА предназначен для коммерческого применения в составе программного
продукта распознавания государственных регистрационных номерных знаков автомобилей.
В связи с этим, главными требованиями к надежности [39] являются стабильность и
скорость работы, а также корректность выходных данных. Для обеспечения надежности в
ПМ ГИНЗА должны быть выполнены следующе требования:
отображение сообщений об ошибках при неверно заданных входных данных;
отображение сообщений об ошибках при отсутствии доступа к файловой системе;
минимизация количества операций чтения записи на диск;
использование библиотек OpenСV [25], Boost [26];
отображение сообщений об ошибках при сбоях в работе, например, об ошибках
переполнения диска.
2.4. Требования к информационной и программной совместимости
ПМ ГИНЗА должен работать на ПК под управлением операционной системой
Windows 7 и выше.
Среда разработки – Microsoft Visual Studio Professional 2015.
ПМ ГИНЗА должен быть обеспечен доступ к файловой системе на запись, чтение и
удаление файлов.
Допускается использование сторонних библиотек, которые могут ускорить или
улучшить функционал разрабатываемого программного модуля.
2.5. Программная реализация
2.5.1. Объектно-ориентированный подход
При разработке ПМ ГИНЗА использовался объектно-ориентированный подход
(ООП). В основе данного подхода лежат принципы, сформулированные создателем первого
объектно-ориентированного языка — Аланом Кейем [40]. Это следующие принципы:
объект — это сущность, которая хранит информацию, а его форма описана в классе;
49
программа — это комплекс объектов, сообщающих друг с другу, что надо делать. Для
обращения друг к другу объекты обмениваются сообщениями, а иногда и ответными
сообщениями;
класс — это тип объекта, определяющий сообщения, которые объект может посылать;
объекты с одинаковым типом могут отправлять и получать одинаковые сообщения.
Объектно-ориентированный подход базируется на следующих основных свойствах:
инкапсуляция — это определение типа данных пользователя, по-другому
называемого классом, который позволяет объединить и скрыть свою реализацию в
своих объектах, а также применять только допускаемые определением класса методы
и операции с этим объектом;
наследование — это такой способ определения пользовательского типа данных, когда
новый тип наследует реализацию уже существующего типа (рис. 2.3).
Рис. 2.3. Наследование классов
При наследовании новый тип данных перенимает все свойства и методы типа, от
которого он унаследован, при этом, новый тип может изменять и расширять эти
свойства и методы;
полиморфизм — это способ ссылаться на различные объекты пользовательских типов
данных единым образом (как правило, используется некоторая иерархия типов).
50
2.5.2. Единый стиль написания кода
Для разработки ПМ ГИНЗА был выбран язык программирования C++. C++
предоставляет большой спектр возможностей, однако такой богатый функционал делает
язык достаточно сложным. Сложный программный код, как правило, содержит большое
количество ошибок и сложен для чтения и понимания другими программистами. Для того,
чтобы сделать код более управляемым и читабельным, существуют некоторые правила
написания программ на C++.
Стиль написания кода или Coding Style — это правила, позволяющие сделать код
более простым и читаемым [42]. Соблюдение этих правил позволяет поддерживать единый
стиль при написании программы и делать её более простой для понимания другими
программистами.
При разработке ПМ ГИНЗА поддерживался единый стиль кода, принятый в
компании АО «ЭЛВИС-НеоТек» [43]. Например, имена переменных должны содержать
только строчные буквы и символ «_» (листинг 2.1), а переменные класса должны иметь
завершающий знак «_» или префикс «m_», при этом стиль названий в одном классе должен
быть единым (листинг 2.2.)
Листинг 2.1. Именование переменных
string variable_name; // ОК – использовано подчёркивание
string variablename; // OK – везде использован нижний регистр
string variableName; // Плохо – использован верхний регистр
Листинг 2.2. Единый стиль названий переменных в одном классе
struct A {
string variable_name_; // OK – использован завершающий знак _
string variablename_; // OK.
};
struct B {
int m_variable_name; // OK – везде использован префикс m_
string m_variable_name; // OK.
};
struct A {
string variable_name_;
string m_variablename; // Плохо – использованы разные обозначения
}
Использование стилистических правил при разработке ПМ ГИНЗА, позволило
обеспечитесь простоту кода и избежать разнообразных распространённых ошибок,
связанных с использованием таких возможностей C++, как шаблоны и исключения.
51
2.5.3. Описание классов ПМ ГИНЗА
В данном подразделе приведены описания классов, разработанных в ходе создания
ПМ ГИНЗА. UML диаграмма классов приведена на рис. 2.4.
Рис. 2.4. Диаграмма классов ПМ ГИНЗА
В представленной диаграмме отражены ассоциативные связи классов и их
содержимое. Класс генерации двумерных изображений 2DLicensePlateGenerator и класс
52
генерации перспективно преобразованных изображений RotatedImageGenerator реализуют
общий интерфейс AbstractLicensePlateGenerator. Класс генерации двумерных изображений
2DLicensePlateGenerator использует в своей работе шаблоны изображений автомобильных
номеров типа LicensePlateTemplateGenerator и случайно сгенерированные автомобильные
номера. После создания и сохранения каждого созданного двумерного изображения типа
2DLicensePlateGenerator генерируются и сохраняются перспективно преобразованные
изображения типа RotatedImageGenerator. Класс генерации перспективно преобразованных
изображений RotatedImageGenerator использует в своей работе матрицу трансформации
изображений TransformationMatrix и случайно сгенерированные автомобильные номера.
Матрицы поворота генерируемых изображений создаются при помощи параметров,
заданных в конфигурационном файле default_params.ini. Параметры конфигурационного
задаются в классе ImageSetting, обрабатывающим введённые пользователем через экранные
формы данные.
Исходный код представленных классов на языке программирования С++ с
подробными комментариями представлен в Приложении 3 к пояснительной записке.
Из соображений компактности, содержимое классов подробно не описывается, а
представлено на диаграмме классов рис. 2.4.
а) AbstractLicensePlateGenerator
Класс
AbstractLicensePlateGenerator
описывает
интерфейс
для
генераторов
двумерных и трёхмерных изображений. Данный класс содержит методы создания и
сохранения изображения, переопределяемые в наследуемых от него классах.
б) 2DLicensePlateGenerator
Класс 2DLicensePlateGenerator наследуется от класса AbstractLicensePlateGenerator и
описывает двумерное изображение автомобильного номера. Данный класс использует
список шаблонов изображений номерных знаков типа LicensePlateTemplateGenerator.
Элементы этого класса представляют собой двумерные изображения со случайными
номерами,
генерируемыми
в
классе
NumberGenerator.
Каждое
сгенерированное
изображение сохраняется в указанную пользователем директорию, с именем, содержащем
порядковый номер сгенерированного изображения и символы номера, представленные на
изображении.
53
в) RotatedImageGenerator
Класс RotatedImageGenerator наследуется от класса AbstractLicensePlateGenerator и
описывает перспективно преобразованное изображение автомобильного номера. Данный
класс использует матрицу трансформации TransformationMatrix для перобразования
изображения номерного знака. Матрица поворота изображения TransformationMatrix
формируется из параметров, заданных в конфигурационном файле default_params.ini.
Элементы
класса
RotatedImageGenerator
представляют
собой
перспективно
преобразованные изображения со случайными номерами, генерируемыми в классе
NumberGenerator. Каждое сгенерированное изображение сохраняется в указанную
пользователем директорию, с именем, содержащем порядковый номер сгенерированного
изображения и символы номера, представленные на изображении.
г) ImageData
Класс ImageData описывает созданное генератором изображение автомобильного
номера. Элементы данного класса хранятся в обновляемом списке сгенерированных
изображений, на основе данных которого производится запись информации в файл с
отчётом о результатах работы ПМ ГИНЗА.
д) LicensePlateTemplateGenerator
Класс LicensePlateTemplateGenerator описывает классы (категории) автомобильных
номеров разных стран. Каждый класс номеров соответствует конкретному генерируемому
регистрационному номерному знаку.
е) NumberGenerator
Класс NumberGenerator описывает формат имени и символов номера генерируемых
изображений.
Имя
каждого
изображения
должно
содержать
порядковый
номер
сгенерированного изображения и символы номера, представленные на изображении. При
этом символы номера генерируются случайным образом с равномерным распределением
символов в каждой позиции номера, в соответствии с типом автомобильного знака.
54
ж) ImageSetting
Класс ImageSetting описывает и обрабатывает введённые пользователем через
экранные формы параметры перспективного преобразования изображений. В случае, если
все параметры заданы корректно, они записываются в конфигурационный файл
default_params.ini. Описание конфигурационного файла приведено в Приложении 5.
з) TransformationMatrix
Класс TransformationMatrix описывает матрицу перспективного преобразования
изображений. Матрица поворота каждого изображения формируется при помощи
параметров, заданных в конфигурационном файле с настройками default_params.ini.
2.6. Описание графического интерфейса
Пользовательский графический интерфейс был разработан в среде разработки
Microsoft Visual Studio Professional 2015, обеспечивающей простоту взаимодействия с
экранными формами и большое количество инструментов для их создания.
Все экранные формы пользовательского интерфейса ПМ ГИНЗА спроектированы с
учетом требований унификации:
все экранные формы графического интерфейса ПМ ГИНЗА созданы в едином
графическом стиле, и имеют одинаковое расположение основных элементов
управления и навигации;
похожие графические значки, кнопки и другие управляющие элементы используются
для обозначения сходных операций;
поведение однотипных элементов интерфейса, например, реакция при наведении
указателя «мыши», переключение фокуса, нажатие на кнопки, реализованы
одинаково для сходных элементов.
Ввод входных данных в ПМ ГИНЗА, отображение результатов выполненных команд,
выполняются в интерактивном режиме. В случае ошибке во введённых входных данных на
экране отображается сообщение об ошибке.
55
Главная форма запуска состоит из полей ввода входных параметров ПМ ГИНЗА и
управляющих кнопок. После запуска ПМ ГИНЗА в графическом режиме на экране появится
окно ввода входных параметров, пример которого приведен на рис. 2.5.
Рис. 2.5. Окно ввода входных параметров
В данном окне в соответствующих полях будут отображаться директория для
сохранения выходных данных, индекс генерируемого вида номерных знаков (описание
индексов представлено в Приложении 4) и количество генерируемых изображений.
Для начала процесса генерации изображений номерных знаков необходимо нажать
кнопку «Запуск» (рисунок 2.5). После нажатия кнопки «Запуск» ПМ ГИНЗА начинает
выполнять проверку введённых пользователем входных параметров. Если какие-то из полей
остались незаполненными или введены некорректно, то ПМ ГИНЗА во всплывающем окне
выведет сообщение с описанием ошибки, пример такого окна приведён на рис. 2.6.
Рис. 2.6. Информационное окно с сообщением о незаполненности всех полей ввода
Сгенерированные изображения сохраняются в указанную пользователем директорию
с эталонным именем (имя содержит номер автомобильного знака, представленного на
изображении). По завершении генерации изображений окно ввода входных данных
закроется и появится информационное сообщение с результатами работы, рис. 2.7.
56
Рис. 2.7. Информационное окно с результатами работы ПМ ГИНЗА
При вводе входных параметров (рис. 2.5) для заполнения поля «Укажите директорию
для сохранения» можно воспользоваться кнопкой «Обзор», после клика по которой
появится стандартное окно Windows обзора файлов и папок. Пример такого окна приведён
на рис. 2.8.
Рис. 2.8. Стандартное окно обзора файлов и папок в MS Windows
В поле «Выберите вид номерного знака» (рис. 2.5) необходимо указать индекс
нужного для генерации вида номерной пластины (описание индексов представлено в
Приложении 4). Для выбора индекса можно воспользоваться кнопкой «Обзор»,
расположенной в соответствующей строке. После клика по этой кнопке появится окно
выбора вида номерного знака (рис. 2.9).
57
Рис. 2.9. Окно выбора генерируемых видов номеров
Параметры перспективного преобразования изображений для ПМ ГИНЗА хранятся в
конфигурационном файле default_params.ini, поставляемом вместе с приложением. Это
простой текстовый файл, хранящий значения некоторых параметров, которые влияют на
работу ПМ ГИНЗА, но меняются крайне редко.
В конфигурационном файле описываются максимальные углы поворотов, шаги углов
поворотов, максимальные смещения и шаги перемещения изображения вдоль осей
координат. Изменить эти параметры можно двумя способами:
отредактировав файл вручную;
воспользовавшись окном настройки параметров (рис. 2.10).
Для открытия файла default_params.ini вручную, необходимо нажать на него правой
клавишей мыши, и в появившемся всплывающем меню выберите пункт «Открыть с
помощью» и выберите любой текстовый редактор.
58
Рис. 2.10. Окно настройки параметров работы программы
Для того, чтобы открыть окно настройки параметров перспективного преобразования
генерируемых изображений, необходимо нажать на кнопку «Дополнительные настройки» в
окне ввода входных данных (рис. 2.5).
Чтобы сохранить введённые параметры, следует нажать на кнопку «Ок». После
нажатия кнопки «Ок», ПМ ГИНЗА изменит значения параметров в конфигурационном
файле настроек default_params.ini на введённые оператором.
ПМ ГИНЗА позволяет отображать генерируемые изображения. При настройке
параметров перспективного преобразования (рис. 2.10), может возникнуть необходимость
протестировать углы поворота и смещения изображений. Для отображения изображения
искажённого в соответствии с указанными параметрами, можно воспользоваться окном
тестирования углов поворота и смещений изображения (рис. 2.11).
59
Рис. 2.11. Окно тестирования углов поворотов и смещений изображения
Для того, чтобы открыть это окно, необходимо нажать на кнопку «Тестирование
параметров» в окне настройки параметров работы программы (рис. 2.10). В левой части окна
можно ввести углы поворотов и смещения изображения вдоль осей координат. Если все
поля ввода заполнены корректно, то при нажатии на кнопку «Обновить», в правой части
окна будут отображаться сгенерированные, в соответствии с задаваемыми параметрами,
изображения.
2.7. Результаты использования ПМ ГИНЗА для обучения нейронной сети
В данном подразделе представлен результат обучения нейронной сети, распознающей
автомобильные номера, на автоматически сгенерированной обучающей выборке.
В компании АО «Элвис-НеоТек», начиная с 2011 г., разрабатываются системы
«Перекрёсток» – многоцелевая автоматическая система фотовидеофиксации нарушений
правил дорожного движения [8] и «Паркинг Контроль» – автоматическая система
фотовидеоконтроля платной парковки [9]. Оба этих комплекса включают блок
распознавания номеров. До настоящего времени для обучения нейронной сети,
распознающей символы, использовались фотографии, полученные с помощью реальных
съёмок транспортных средств. Эти фотографии отбирались и обрабатывались вручную, в
частности, на каждом снимке должно было находиться только одно изображение номерного
знака. Кроме того, имя каждого файла должно было содержать номер, который изображен
на фотографии.
60
Главная проблема обучения нейронной сети данными, полученными с помощью
реальных съёмок заключается в том, что формирование выборки необходимого объёма
занимает много времени, кроме того, после обучения нейронная сеть недостаточно
эффективно распознаёт редкие форматы номеров. В частности, при использовании системы
«Перекрёсток» в Израиле выяснилось, что нейронная сеть, обученная такими данными, не
позволяет с хорошим качеством распознавать один из принятых там стандартов номеров
(узкие номера). Узкие номера (рис. 2.12, а) на практике встречаются реже широких (рис.
2.12, б), поэтому выборка, полученная с помощью съёмок, содержит недостаточное для
эффективного обучения количество фотографий машин с узкими номерами.
а)
б)
Рис. 2.12. Узкие (а) и широкие (б) израильские автомобильные номера
Для повышения качества распознавания и скорости обучения нейронной сети
обучающая выборка сформирована из автоматически сгенерированных изображений
номерных знаков автомобилей. Для имитации искажений съёмки используются
проективные преобразования. Полученная таким образом выборка включает все стандарты
номеров, причём доля редких видов достаточна для эффективного их распознавания.
Представлены результаты распознавания израильских автомобильных номеров
системой «Перекрёсток». Нейронная сеть этой системы обучена на синтетической выборке
изображений номерных знаков, сформированной ПМ ГИНЗА.
Всего при тестировании использовалась выборка из 6735 фотографий израильских
автомобильных номеров, 2010 из которых содержат узкие номерные знаки. Узкие номера
составляют примерно 30% от всех номеров. Результаты тестирования показали, что
точность распознавания узких израильских номеров системой «Перекрёсток» повысилась
на 27% до значения 94% (рис. 1.13). Точность распознавания полноценной тестовой
выборки израильских номеров повысилась более чем на 10% до 94% (рис. 1.14).
61
Рис. 1.13. Результат распознавания узких израильских номеров
Рис. 1.14. Результат распознавания израильских номеров
62
Применение предлагаемого генератора позволяет не только значительно ускорить
создание обучающей выборки, но и повысить качество распознавания редко используемых
стандартов номеров.
Выводы
В данном раздела были проанализированы требования к ПМ ГИНЗА и выбраны
инструментальные средства разработки. В результате проведенных исследований были
определены требования к надежности, составу и параметрам технических средств,
информационной
и
программной
совместимости.
Была
осуществлена
разработка
пользовательского интерфейса и программная реализация ПМ ГИНЗА, а также, приведены
результаты использования ПМ ГИНЗА.
63
3. ТЕХНОЛОГИЧЕСКИЙ РАЗДЕЛ
3.1. Отладка ПМ ГИНЗА
Отладка [47] – это этап разработки программного обеспечения, в ходе выполнения,
которого локализируются и устраняются ошибки. Для выявления причин и мест
возникновения ошибок используется анализ текущих значений переменных и путей
выполнения
программы.
Для
отладки
программного
обеспечения
допускается
использование двух технологии, которые дополняют друг друга, это отладка при помощи
отладчиков и при помощи вывода текущего состояния программы.
Методы отладки можно разделить на две основные подгруппы: статические методы и
динамические методы. Применение этих методов зависит от конкретной реализации
программы.
Статические методы – это методы, которые выполняются, не требуя запуска и
исполнения
программы
[47].
Статические
методы
практически
не
нуждаются
вычислительных мощностях, однако требуют больших затрат времени программиста. К
статическим методам отладки программ относят прокрутку программы вручную или с
помощью программных анализаторов (например, компилятор), а также коллективную
проверку кода программы и проверку кода программистом-технологом.
Динамические методы требуют больших вычислительных мощностей, при этом
отладка выполняется совместно с исполнением программы [47]. Данная подгруппа методов
отладки, как правило, привязана к конкретному транслятору (компилятору), либо к среде
разработки. К динамическим методам отладки программ относятся такие методы, как поиск
ошибок с применением сторонних системных средств, а также использование специальных
отладчиков.
При разработке ПМ ГИНЗА для отладки были применены следующие методы и
технологии:
отладка кода на языке C++ при помощи отладчика, встроенного в среду разработки
Visual Studio [48];
идентификация и отладка ошибок программирования, связанных с использованием
памяти с помощью анализатора Dr. Memory [49];
64
использование системы рецензирования кода ReviewBoard [50] для коллективного
анализа кода, с целью выявить ошибки и недочёты в несоответствии кода
поставленной задаче;
логирование путём вывода сообщений о ходе выполнения программы в лог-файлы
[52].
3.1.1. Использование отладчика Microsoft Visual Studio для отладки ПМ ГИНЗА
Отладчик, встроенный в среду разработки Visual Studio [48], имеет пользовательский
графический интерфейс и позволяет вести наблюдение за текущими значениями
переменных, путями выполнения программы. Отладчик может быть использован для
отладки всех языков программирования, поддерживаемых средой разработки Visual Studio,
таких как C, C++, C#, Python, JavaScript. Данный отладчик обеспечивает выполнение
следующих функций:
прерывание и приостановка выполнения программы;
вычисление и изменение значений переменных;
просмотр значений в области памяти;
отслеживание состояний регистров;
просмотр инструкций процессора, из которых состоит ПО.
При разработке ПМ ГИНЗА использовались следующие два метода отладки,
предоставляемые отладчиком Visual Studio:
трассировка – статический метод отладки;
отладка с использованием точек останова – динамический метод отладки.
а) Трассировка
Трассировка обеспечивает пошаговое выполнение программы с возможностью
остановок на каждой команде или строке кода [48]. При запуске трассировки программы
программист может просматривать порядок выполнения команд, стек вызова функций, и
значения всех переменных на конкретном шаге выполнения программы. Такой процесс
позволяет легко обнаруживать ошибки, однако требует временных затрат программиста.
65
Трассировка можно начать и закончить из любого места в программе, а выполнение
программы может останавливаться на любой команде или в местах, где поставлены точки
останова.
При трассировке программ с помощью отладчика Visual Studio программисту
предоставляются следующие команды контроля исполнения программы:
Шаг внутрь (англ. Step Into) – программа выполняет текущую строку кода, а затем
курсор переходит на следующую строку;
Шаг с обходом (англ. Step Over) – команда очень похожа на предыдущую, однако,
если текущая строка подразумевает вход в отдельно описанную процедуру, то код,
содержащийся в ней, выполнится без остановок;
Выполнить до курсора (англ. Run to Cursor) – программа будет выполнять без
остановки все строки, пока не дойдет до строки, на которой находится курсор.
Процесс использование метода отладки – трассировка – представлен на рис. 3.1.
Рис. 3.1. Использование трассировки
б) Отладка с использованием точек останова
В процессе разработки и отладки ПМ ГИНЗА был использован динамический метод
отладки – отладка с использованием точек останова [48]. Для выполнения данного метода
отладки использовался встроенный в интегрированную среду разработки отладчик
Microsoft Visual Studio 2015.
Суть метода отладка с использованием точек останова состоит в размещении точек
останова в программе с целью проконтролировать процесс выполнения программы в этих
66
точках. При запуске программы в данном режиме отладки он будет работать в штатном
режиме пока не достигнет точки останова. Как только при выполнении программы
достигается точка останова, штатное выполнение работы программы приостанавливается и
управление передается на отладчик среды программирования. Как только осуществляется
переход в отладчик MS Visual Studio у программиста появляется возможность отслеживать
состояния различных параметров программы в конкретные моменты времени, включая
значения переменных и стек вызовов функций.
Отладчик среды Microsoft Visual Studio 2015 позволяет устанавливать точки останова
с условиями остановки. При достижении точки останова с условием, среда разработки
останавливает выполнение программы только в том случае, в выполнено условие остановки
в данной точке, которое может содержать определенные значения переменных либо
диапазон значений. Также, MS Visual Studio предоставляет возможность устанавливать
точки останова, на которых программа остановится только при прохождении точки
определенное количество раз, такая возможность бывает крайне полезна при отладке
циклов.
Процесс отладки ПМ ГИНЗА с использованием точек останова отладчика Visual
Studio показан на рис. 3.2.
Рис. 3.2. Использование отладчика Visual Studio
67
Отладка ПМ ГИНЗА при помощи отладчика Microsoft Visual Studio помогла выявить
и устранить логические ошибки, которые нарушали логику программы и приводили к
неверным результатам.
3.1.2. Отладка ошибок использования памяти ПМ ГИНЗА с помощью Dr. Memory
Для контроля корректности использования памяти применяется анализатор Dr. Memory
[49]. Dr. Memory работает на не модифицированных бинарных файлах приложений под ОС
Windows, GNU/Linux или Mac, распространяется бесплатно и работает быстрее, чем
аналогичные
инструменты.
Dr.
Memory
позволяет
идентифицировать
ошибки
программирования, связанные с памятью:
обращение к несуществующим элементам массива из-за ошибок индексации;
использование памяти после ее освобождения;
использование неинициализированной памяти;
повторная очистка памяти;
контроль утечек системных дескрипторов;
контроль работы с дескрипторами графической подсистемы Windows;
получает доступ к освобождённой памяти;
обрабатывает утечки памяти.
Использование Dr. Memory позволило найти и устранить ошибки использования
неинициализированной памяти, что улучшило качество ПМ ГИНЗА.
3.1.3. Отладка ПМ ГИНЗА с помощью системы рецензирования кода Review Board
Review Board – это специализированная система, обеспечивающая возможность
рецензирования кода (code review) [50]. Изначально эта система появилась как внутренняя
разработка VMWare, но через некоторое время была передана в open source.
Система рецензирования кода Review Board используется для коллективного анализа
кода, с целью выявить ошибки и недочёты в несоответствии кода поставленной задаче.
Очевидные плюсы использования системы Review Board следующие:
улучшается правильность кода;
68
выявляются различные ошибки и опечатки;
код оформляется в соответствии с Coding Style;
эффективен при обучении «новичков», позволяет быстро набирать навыки,
происходит выравнивание опыта и обмен знаниями.
Процесс review (рецензирования кода) состоит из двух этапов:
design review — анализ будущего дизайна (архитектуры);
code review — анализ написанного кода.
Design review — это анализ будущего дизайна или архитектуры программы. Этот этап
очень важен, поскольку без него review кода будет либо мало полезным, либо вообще
бесполезным (если программист написал код, который неверно решает поставленную
задачу, или не удовлетворяет поставленным требованиям по использованию памяти,
времени и т.д.).
Code review — это коллективный анализ написанного кода, цель которого выявить
ошибки и недочёты связанные с несоответствием кода поставленной задаче На этом этапе
автору кода оставляют замечания и комментарии к коду.
Основной рабочий объект в Review Board это запрос на рецензию (review request). Он
представляет из себя разницу между двумя файлами, содержащую изменения, авторское
описание назначения изменений и другую информацию [51]. Подобная работа с запросами
организована по типу электронной почты, а именно, запросы условно можно разделить на
входящие и исходящие, рецензия или ревью на входящий запрос интерпретируется
системой как ответ автору запроса. Вначле исправляются замечания, зафиксированные
ревьюерами, а после того, как все ревьюеры поставят оценку «Дать добро на интеграцию»
на текущую рецензию, её можно считать закрытой, для закрытия задачи надо перевести её
в статус submitted. После успешного прохождения рецензирования код, он может быть
включенным в основную или главную ветку проекта.
Ещё одним плюсом системы Review Board является его интерфейс. В Review Board
красиво организована просмотр изменений — с подсветкой изменений, при чём, новый код,
удалённый и изменённый подсвечиваются разными цветами, синтаксиса для большинства
распространенных языков, даже конкретных изменений внутри одной строки
Использование системы Review Board для отладки ПМ ГИНЗА позволило значительно
улучшить качество и стиль написания кода.
69
3.1.4. Логирование
Логирование – это метод отладки программного обеспечения [52].
Изначально, логирование кода стало использоваться для отладки программного
обеспечения, как отладка путём вывода в консоль сообщений об ошибках и значений
переменных. Сейчас логирование подразумевает и вывод в лог-файлы.
Результат логирования, то есть сообщения или значения переменных, которые
выводятся на консоль или в файл называется логом.
На сегодняшний день логирование стало крайне распространённым и универсальным
методом для отладки программы, что, при программировании без логирования достаточно
сложно отлаживать код, а о серверных логах конечно слышали все.
Использование метода логирования при отладке ПМ ГИНЗА, позволило легко и
быстро просматривать информацию об ошибках, записанную в логи. Благодаря лог-файлам,
можно было увидеть имена, типы номерных знаков, символы автомобильного номера
генерируемых изображений в ходе создания, которых произошла ошибка. Эта информация
помогла найти и отладить ошибки, которые заключались в формировании уникальных имён
генерируемых изображений.
3.1.5. Результаты отладки ПМ ГИНЗА
В ходе выполнения отладки ПМ ГИНЗА, с помощью описанных методов отладки
программ, были достигнуты следующие результаты:
использование отладчика Microsoft Visual Studio помогло выявить и устранить
ошибки в логике построения кода, которые нарушали логику работы и приводили к
неверным результатам.
метод отладки с помощью утилиты Dr. Memory позволил найти и устранить ошибки
использования неинициализированной памяти, что улучшило качество ПМ ГИНЗА.
использование системы Review Board для отладки ПМ ГИНЗА позволило исправить
опечатки и значительно улучшить качество и стиль написания кода.
отладка ПМ ГИНЗА с помощью метода логирования, помогла найти и отладить
ошибки, которые заключались в формировании уникальных имён генерируемых
изображений. Благодаря лог-файлам, в которые записывались имена, типы номерных
70
знаков, символы автомобильного номера генерируемых изображений, в ходе
создания, которых произошла ошибка.
3.2. Тестирование ПМ ГИНЗА
Тестирование [53] – это деятельность, которая выполняется для оценки качества и
улучшения программного обеспечения. В основе тестирование лежат тестовые процедуры с
определёнными входными данными, начальными условиями и известным ожидаемым
результатом. Такие процедуры разработаны для достижения конкретной цели, называемой
проверка программного приложения или проверка на соответствие определенным
требованиям. Тестовые процедуры предназначены для проверки различного функционала
программы.
При разработке ПМ ГИНЗА для тестирования использовались следующие виды и
методы тестирования:
модульное, интеграционное и системное тестирование ПМ ГИНЗА [54];
тестирование методами «белого ящика» и «чёрного ящика» [55];
тестирование пользовательского интерфейса ПМ ГИНЗА [56];
использование инструмента непрерывной интеграции Jenkins [57];
тестирование производительности ПМ ГИНЗА [58].
3.2.1. Модульное, интеграционное и системное тестирование ПМ ГИНЗА
Тестирование ПМ ГИНЗА состояло из трёх этапов:
модульное тестирование;
интеграционное тестирование;
системное тестирование.
а) Модульное тестирование
На этапе модульного тестирования производится отдельное тестирование небольших
элементов системы, которые максимально отделены от других элементов. Данный вид
тестирования обычно проводится сразу после разработки каждого из элементов
71
программного продукта, его цель состоит в оценке соответствия функционала каждого из
спроектированной компонентов требованиям.
б) Интеграционное тестирование
Интеграционное тестирование также называют комплексным тестированием. На
этапе интеграционного тестирования производится тестирование объединённых элементов,
компонентов
или
подсистем
общей
системы,
обычно
они
представляют
взаимодействующие между собой группы элементов.
Интеграционное тестирование заключается не в тестировании функциональности
каждого из элементов программного модуля, а на тестирования взаимодействия отдельных
модулей программы между собой в соответствии с требованиями. Такое тестирование
выполняется,
когда
все
модули
программы
реализованы
и
отлажены.
После
интеграционного тестирования все модули интегрируются в единую программу.
в) Системное тестирование
Системное тестирование выполняется после того, как система разработана. Когда все
составляющие систему компоненты готовы, она должна быть протестирована на
соответствие поставленным требованиям, то есть должна быть произведена проверка на
реализацию всех функциональных и нефункциональных требования, предъявляемых к
разрабатываемой системе.На этапе системного тестирования приложение или система
тестируются целиком.
При тестировании ПМ ГИНЗА сперва выполнялись тестирование и отладка каждого
отдельного модуля, после этого проверялось взаимодействие между модулями, а затем
тестировалось функционирование всего программного модуля.
Тестирование всех возможных сценариев выполнения ПМ ГИНЗА невозможно
провести в разумные сроки. В связи с этим были выделены подмножества возможных
тестовых сценариев. Они составлялись на основе следующего плана разработки:
анализ требований;
анализ граничных значений;
определение шагов теста;
написание тест-кейса на основании требований, тестовых данных и шагов теста.
72
Модульное, интеграционное и системное тестирование ПМ ГИНЗА осуществлялось
в соответствии с его структурной схемой, представленной на рис. 3.3.
Рис. 3.3. Структурная схема ПМ ГИНЗА
Тестирование ПМ ГИНЗА состояло из трёх этапов:
модульного;
интеграционного;
системного.
Сначала
выполнялось
модульное
тестирование.
В
ходе
его
проведения,
осуществлялись тестирование и отладка каждого отдельного модуля программы (пример
отдельных модулей ПМ ГИНЗА приведён на рис. 3.3). Следующим шагом проводилось
интеграционное или функциональное тестирование ПМ ГИНЗА. На этом этапе
тестирования проверялось взаимодействие между модулями программы (взаимодействия
между модулями ПМ ГИНЗА представлены на рис. 3.3). Последним этапом выполнялось
системное тестирование, которое заключается в тестировании функционирования ПМ
ГИНЗА на соответствие требованиям (комплекс блоков, составляющих ПМ ГИНЗА,
приведён на рис. 3.3)
73
Несколько основных тестовых сценариев тестирования функционала ПМ ГИНЗА
представлены в таблице 3.1.
Таблица 3.1
Тестовые сценарии проверки функциональности ПМ ГИНЗА
№
Описание
Шаги теста
Ожидаемые
результаты
1
Тестирование
1. Запустить ПМ
1. ПМ ГИНЗА
передачи в ПМ
ГИНЗА.
запущен и готов к
ГИНЗА
2. Заполнить в
работе.
некорректных
появившемся
3. При нажатии
входных
окне поля ввода
кнопки «Запуск»,
параметров
некорректными
появляется
параметрами.
всплывающее окно с
Реальные
Прошел /
результаты Не прошел
+
Прошёл
+
Прошёл
3. Нажать кнопку информационным
«Запуск».
сообщением об
ошибке.
2
Тестирование
1. В окне тест-ия
2. В окне
перспективного углов поворота и
тестирования углов
преобразования смещений изобр.
поворота и смещений
изображений в
Заполнить все
изображений
окне
поля ввода
отобразилось
тестирования
нулевыми
несмещённое и
углов поворота
значениями.
неискажённое
и смещений
2. Нажать кнопку изображение.
изображения
«обновить».
4. В данном окне
3. Заполнить все
отобразилось
поля ввода
смещённое и
нулевыми
искажённое на
значениями.
указанные значения
4. Нажать кнопку изображение
«обновить».
номерного знака.
74
Продолжений таблицы 3.1
3
Тестирование 1. В окне ввода
2. Окно ввода
выполнения
входных данных
входных данных
основного
указать
закроется. Появится
назначения
корректные
информационное
ПМ ГИНЗА –
входные
сообщение об
генерации
параметры.
успешной генерации
перспективно
2. Нажать кнопку
изображений. По
искажённых
«Запуск».
окончании работы
изображений
ПМ ГИНЗА в
номерных
указанной во входных
знаков
параметрах
автомобилей
директории появятся
+
Прошёл
сгенерированные
изображения,
соответствующие
введённым данным.
Для тестирования ПМ ГИНЗА было запрограммированно:
11 модульных тестов (пример тестового сценария для модульных тестов приведён в
таблице 3.1 под номером 1);
4 интеграционных теста (пример тестового сценария для интеграционных тестов
приведён в таблице 3.1 под номером 2);
1 системный тест (тестовый сценарий данного теста приведён в таблице 3.1 – номер
теста 3).
3.2.2. Тестирование методами «белого ящика» и «чёрного ящика»
В настоящее время существует два основных метода тестирования ПО:
метод «черного ящика» [56];
метод «белого ящика» [55].
Рассмотрим детальнее каждую из них.
75
а) Метод тестирования «белого ящика»
Метод тестирования «белого ящика» применяется для выявления ошибок во
внутренней структуре программы. Данный метод тестирования, предполагает проведение
испытаний с учетом знаний о внутренней структуре программы. Входные и ожидаемые
данные в случае данной методики тестирования выбираются на основе анализа
программного кода.
Для данного метода выделяются следующие приемы тестирования:
покрытие операторов (все операторы в программе должны выполняться хотя бы по
одному разу);
покрытие решений (проверка, что программа выполняется правильно, когда
принимает истинные и ложные значения);
покрытие решений и условий (тесты составляются таким образом, чтобы результаты
всех условий выполнялись хотя бы по одному разу, результаты каждого из решений
также должны выполняться хотя по одному разу, и все операторы должны быть
выполнены не менее одного раза).
комбинаторное покрытие условий (покрываются всевозможные комбинации
результатов условий в каждом решении, все операторы должны быть выполнен не
менее одного раза).
Тестирование методом «белого ящика» подходит для тестирования на уровне
отдельных модулей, интеграционном и системной уровне.
б) Метод тестирования «чёрного ящика»
Метод тестирования «чёрного ящика», применяется для выявления, отсутствующего
или неверно выполняемого функционала ПО, и позволяет оценить соответствие ПО и
предъявляемых к нему требований [55]. При использовании данного метода тестирования
мы выступаем в роли пользователя и не используем никаких знаний о внутреннем
устройстве проверяемой системы. Данная методология состоит в проверке правильности
выполнения программ и обеспечения, возложенных на него функций.
Для данного метода выделяется пять приемов тестирования:
1. Эквивалентное разбиение. Разбиения тестов на классы эквивалентности
направлено на уменьшение общего числа необходимых тестовых сценариев. Это
76
достигается путём разбиения входных условий или параметров на конечное количество
классов эквивалентности. При эквивалентном разбиении создается два типа классов:
допустимые входные данные программы относятся к допустимому классу эквивалентности,
а все остальные входные данные программы относятся к недопустимому классу
эквивалентности.
2.
Анализ
эквивалентности.
граничных
значений.
Он
выполняется
после
выбора
классов
Предполагается, что вероятность нахождения ошибка на границах
классов эквивалентностей больше, чем в других местах этих классов. Граничные условия –
это ближние значения, с обеих сторон от крайних значений. Крайние значения определяют
границы классов эквивалентности. Для тестирования граничных значений из класса
эквивалентности выбираются: минимальное значение (min), значение, на одно больше
минимального (min+), значение, на одно меньше максимального (max-), и максимальное
значение (max).
3. Анализ причинно-следственных связей. Такой вид тестирования, применительно к
разрабатываемому ПМ ГИНЗА, в качестве причин определяет входные данные, а роли
следствий – получаемые результаты.
4. Предположение об ошибке. Данный приём тестирования подразумевает
составление возможных ошибок и ситуаций, в которых эти ошибки могут возникнуть. Затем
на каждую такую ошибку составляются тест-кейсы.
5 Тестовые сценарии для метода «чёрного ящика» отражают использование системы
пользователями в будущем. Такая методология тестирования позволяет сделать выводы о
соответствии требованиям и надежности программного продукта.
3.2.3. Тестирования пользовательского интерфейса ПМ ГИНЗА
Тестирования пользовательского интерфейса (UI) позволяет выяснить, насколько он
удобен в использовании, а также его соответствие заданным требованиям [56].
Данный вид тестирования позволяет оценить ожидаемо ли ведет себя программа, а
также оценить отображение элементов интерфейса на отличающихся устройствах при
совершении пользователем один и тех же тестовых действий. Такое тестирования
пользовательского интерфейса позволяет определить эффективность работы пользователя с
программным модулем.
77
Задача тестирования пользовательского интерфейса заключается в выявлении
структурных и визуальных недостатков в интерфейсе программного модуля, анализе и
оценке удобства использования интерфейса для навигации, и, наконец, возможности
использования всего функционала приложения. В ходе данного вида тестирования
проверяется реакция элементов интерфейса на действия пользователя, и обработка
приложением событий, связанных с использованием клавиатуры и мыши или тач-пада. Для
тестирования пользовательского интерфейса существует несколько подходов:
ручное тестирование, целью которого является проверка графического интерфейса
приложение на соответствие макетам дизайна и прототипа;
автоматизированное тестирование, которое выполняется после каждой сборки
продукта, с целью выявления ошибок в работе интерфейса;
проведение фокус-групп.
Для проведения тестирования пользовательского интерфейса, можно выделить
следующие критерии создания качественного интерфейса:
минимальное время выполнения задач пользователем;
минимальное количество ошибок, которые может допускает пользователь при работе
с приложением;
полное понимание интерфейса пользователями и отсутствие неоднозначностей при
работе с ним;
минимальный объем вводимой пользователями информации;
простота и визуальная привлекательность интерфейса.
Данный
вид
тестирования
использовался
для
тестирования
ПМ
ГИНЗА.
Тестирование пользовательского интерфейса ПМ ГИНЗА позволило улучшить качество
разработанного приложения и повысить удобство его использования. По окончанию
тестирования был составлен отчет с результатами тестирования и идеями по улучшению
пользовательского интерфейса.
3.2.4. Использование инструмента непрерывной интеграции Jenkins
Jenkins – это свободно распространяемый инструмент непрерывной интеграции, который
часто используется для разработки программного обеспечения [57]. Jenkins – это среда
автоматизации, целью которой является выполнение повторяющихся заданий. Данный
78
инструмент непрерывной интеграции может контролировать и выполнять команды,
поступающие с удаленных систем.
Достоинства системы непрерывной интеграции Jenkins:
при поломке сборки один из участников проекта, система сразу оповещает об это по
почте всех участников данного проекта, это позволяет быстро устранить проблему;
возможность автоматизации прогона тестов;
Jenkins хранит отчеты о прогоне тестов.
Инструмент непрерывной интеграции – Jenkins – использовался для организации
тестирования ПМ ГИНЗА. С помощью Jenkins был организован покоммитный прогон
модульных или функциональных тестов ПМ ГИНЗА. Модульные тесты ПМ ГИНЗА
выполняются на сервере Jenkins после каждого нового коммита и через заданные интервалы
времени. Jenkins позволяет эффективно решать проблемы, в случае неудачного
прохождения тестов, за счёт быстрого оповещения.
3.2.5. Тестирование производительности ПМ ГИНЗА
Для тестирования производительности программного модуля использовались два
профилировщика:
Windows Performance Analyzer [58];
Visual Studio Profiling Tools [59].
В начале выполнения каждой из вычислительных задач графа выполнения, относящейся
к ПМ ГИНЗА, записывается метка времени, вторая метка времени записывается после
окончания задачи. Для контроля производительности обработки данных используются
встроенные
средства
замера
времени
выполнения,
результаты
работы
которых
направляются во встроенную систему профилирования. Полученные данные подвергаются
анализу по следующим критериям:
среднее время выполнения;
разброс времени выполнения;
наличие статистических выбросов.
Для анализа проблем с производительностью в ПМ ГИНЗА применяется средство
контроля производительности Visual Studio Profiling Tools. Данное средство позволяет
разработчику
найти
функции,
которые
выполняют
основную
часть
работы
в
79
пользовательском режиме приложения. С профилирования функций, которые выполняются
в приложении, удобно начать поиск областей, позволяющих ускорить работу приложения.
Visual Studio Profiling Tools имеет графический интерфейс, показанный на рис. 3.4,
позволяющий разработчикам анализировать эти данные.
Рис. 3.4. Visual Studio Profiling Tools список функций, выполняющих основную работу
Для
оценки
производительности
программного
модуля
использовались
профилировщики: Windows Performance Analyzer и Visual Studio Profiling Tools. График
загрузки процессора по оси времени построенные данными профилировщиками показаны
на рис. 3.5 и 3.6.
Рис. 3.5. График загрузки процессора в Windows Performance Analyzer
80
Рис. 3.6. График загрузки процессора в Visual Studio Profiling Tools
Профилирование ПМ ГИНЗА показало, что явных узких мест в программе не
наблюдается.
3.2.6. Результаты тестирования ПМ ГИНЗА
В ходе выполнения тестирования ПМ ГИНЗА, с помощью описанных методов
тестирования программ, были достигнуты следующие результаты:
протестирована функциональность всех модулей ПМ ГИНЗА, при помощи
разработки одиннадцати модульных тестов (использовались методы «белого» и
«чёрного» ящика);
проверено взаимодействие всех модулей программы на соответствие архитектуре
ПМ ГИНЗА, и проверена реализация функциональных и нефункциональных
требований, при помощи разработки четырёх интеграционных тестов;
проверена реализация главной функции ПМ ГИНЗА, при помощи разработки
системного теста;
улучшено качество и удобство использования пользовательского интерфейса ПМ
ГИНЗА;
был организован покоммитный прогон модульных или функциональных тестов ПМ
ГИНЗА на сервере непрерывной интеграции Jenkins;
было проведено профилирование ПМ ГИНЗА.
81
Выводы
В данном раздела были описаны применявшиеся средства и методы для отладки ПМ
ГИНЗА, а именно отладчик MS Visual Studio, анализатор Dr. Memory, система
рецензирования кода Review и метод логирования, приводятся результаты отладки ПМ
ГИНЗА. Также, описаны применявшиеся методы и средства тестирования ПМ ГИНЗА,
описывается процесс составления тест-кейсов и сами тест-кейсы для модульного,
функционального и системного тестирования ПМ ГИНЗА, описывается процесс и
результаты тестирования пользовательского интерфейса ПМ ГИНЗА, приведено описание
инструмента непрерывной интеграции Jenkins, предназначенного для покоммитного
прогона функциональных тестов, а также средства и результаты тестирования
производительности ПМ ГИНЗА.
82
Заключение
Данная работа была посвящена разработке программного модуля генерации
изображений номерных знаков автомобилей, назначение которого заключается в
формировании синтетических обучающих выборок для нейронных сетей, распознающих
регистрационные автомобильные знаки.
В ходе разработки ПМ ГИНЗА были выполнены следующие задачи:
исследована предметная область;
проведён сравнительный анализ существующих программных решений;
выбраны инструментальные средства и среда разработки;
разработана схема данных ПМ ГИНЗА;
разработан алгоритм работы ПМ ГИНЗА;
разработан пользовательский интерфейс ПМ ГИНЗА;
выполнена программная реализация ПМ ГИНЗА;
проведена отладка и тестирование ПМ ГИНЗА;
разработано руководство оператора.
Применение ПМ ГИНЗА позволило не только значительно ускорить создание
обучающей выборки, но и повысить качество распознавания редко используемых
стандартов номеров.
ПМ ГИНЗА внедрён на предприятии АО «ЭЛВИС-НеоТек» в многоцелевую
автоматическую систему фотовидеофиксации нарушений правил дорожного движения
«Перекрёсток». Применение ПМ ГИНЗА для обучения нейронной сети системы
«Перекрёсток» повысило процент распознавания узких израильских номеров на 27% до
значения 94.21%. Точность работы классификатора при обработке видеопотока,
поступающего с камер, установленных в Израиле, стала составлять более чем 93% верно
распознанных кадров, вместо 82.7%. При этом, доля неверно распознаваемых фотографий
автомобильных номеров уменьшилась с 55%, а процент не распознанных кадров сократился
на 70%.
Результаты работы апробированы на 9-ой Всероссийской научно-практической
конференции «Актуальные проблемы информатизации в науке, образовании и экономике»2016, и 24-ой Всероссийской межвузовской научно-технической конференции студентов и
аспирантов «Микроэлектроника и информатика»-2017. Содержание и выводы работы
83
представлены в статье, принятой для публикации изданием «Известия высших учебных
заведений. Электроника», включенным в список журналов рекомендованных ВАК
Министерства образования и науки РФ. Основные положения работы докладывались на
Всероссийском конкурсе проектов и разработок в области IT-технологий «IT-прорыв»
сезона 2016-2017. Апробация практической части ВКР подтверждается внедрением
результатов ВКР в деятельность предприятия АО «ЭЛВИС-НеоТек».
84
СПИСОК ЛИТЕРАТУРЫ
1. Л.Г. Гагарина, Р.А. Касимов, Д.Г. Коваленко, Е.Л. Федотова, ЧжоЗо Е, Б.В. Черников.
Методические указания по подготовке выпускной квалификационной работы по
направлению подготовки бакалавров 09.03.04 «Программная инженерия» / Под ред.
Б.В. Черникова. – М.: МИЭТ, 2016.
2. Гагарина Л.Г., Кокорева Е.В., Виснадул Б.Д. Технология разработки программного
обеспечения: учебное пособие / под ред. Л.Г. Гагариной. – М.: ИД «ФОРУМ»:
ИНФРА-М., 2008.
3. LeCun Y. et al. Comparison of learning algorithms for handwritten digit recognition
//International conference on artificial neural networks. – 1995. – Т. 60. – С. 53-60.
4. Number
Plate
Recognition
Using
an
Improved
Segmentation.
–
URL:
https://www.ijirset.com/upload/2014/may/44_Number.pdf (дата обращения: 22.05.2017).
5. Movellan J. Tutorial on Gabor Filters. 2008. URL: http://mplab.ucsd.edu/tutorials/gabor.pdf
(дата обращения: 10.05.2017).
6. Jain, V. and Seung, S. H. (2008). Natural image denoising with convolutional networks. In
NIPS’2008.
7. Deep neural networks performance optimization in image recognition. – URL:
http://repo.ssau.ru/bitstream/Informacionnye-tehnologii-i-nanotehnologii/Deep-neuralnetworks-performance-optimization-in-image-recognition-63757/1/paper%20122_649654.pdf (дата обращения: 22.05.2017).
8. Многоцелевая автоматическая система фотовидеофиксации нарушений правил
дорожного движения «Перекрёсток». – URL: http://old.elvees.ru/index.php?id=106
(дата обращения: 16.05.2017).
9. Автоматическая система фотовидеоконтроля платной парковки «Паркинг Контроль».
– URL: http://old.elvees.ru/index.php?id=107 (дата обращения: 16.05.2017).
10. Narayanan Vivek, Arora Ishan, Bhatia Arjun. Fast and accurate sentiment classification
using an enhanced Naive Bayes model // Intelligent Data Engineering and Automated
Learning–IDEAL 2013. – Springer, 2013. – 204 с.
11. Abbasi Ahmed, Chen Hsinchun, Salem Arab. Sentiment analysis in multiple languages:
Feature selection for opinion classification in Web forums // ACM Transactions on
Information Systems (TOIS). – 2008. –Vol. 26, no. 3. – Р. 12.
12. Понарин Я. П. Аффинная и проективная геометрия. – М.: МЦНМО, 2009.
85
13. Сиденко Л.А. Компьютерная графика и геометрическое моделирование: Учебное
пособие. – СПб.: Питер, 2009. – 224 с.
14. Клейн Ф. Элементарная математика с точки зрения высшей. – М.: Наука, 1987.
15. Шлее М. Qt 5.3. Профессиональное программирование на C++ [Текст] / М. Шлее –
СПб: БХВ-Петербург, -2012 -912 с.
16. Документация
Adobe
Photoshop
[Электронный
ресурс].
URL:
http://www.adobe.com/ru/products/photoshop.html (дата обращения 02.03.2017).
17. Документация GIMP – GNU Image Manipulation Program [Электронный ресурс]. URL:
https://www.gimp.org (дата обращения 02.03.2017).
18. Документация Unity- Game Engine [Электронный ресурс]. URL: https://unity3d.com/ru
(дата обращения 04.05.2017).
19. Колдаев В.Д. Основы алгоритмизации и программирования: учебное пособие. / Под
ред. Л.Г. Гагариной. - М.: ИД «ФОРУМ»: ИНФРА-М, 2012. – 416 с.
20. C++ reference [Электронный ресурс]. URL: http://en.cppreference.com/w/cpp (дата
обращения: 04.03.2017).
21. Брайан Керниган, Деннис Ритчи. Язык программирования C. – Москва: Вильямс,
2006. – 304 с.
22. Документация Java [Электронный ресурс]. URL: https://docs.oracle.com/javase/8/ (дата
обращения 04.03.2017).
23. C#
Reference
[Электронный
ресурс].
URL:
https://msdn.microsoft.com/en-
us/library/618ayhy6.aspx (дата обращения 04.04.2016).
24. Документация Python [Электронный ресурс]. URL: https://www.python.org/doc/ (дата
обращения 15.04.2017).
25. Boost Library Documentation [Электронный ресурс] / Boost C++ Library Web Site URL:
http://www.boost.org/doc/libs/ (дата обращения: 10.05.2017).
26. OpenCV Documentation [Электронный ресурс]. URL: http://opencv.org/ (дата
обращения: 28.04.2017).
27. Документация
Microsoft
Visual
Studio
[Электронный
ресурс].
URL:
https://msdn.microsoft.com/en-us/library/60k1461a.aspx (дата обращения: 03.03.2017).
28. Официальный
сайт
JetBrains
CLion
[Электронный
ресурс].
URL:
https://www.jetbrains.com/clion/(дата обращения 03.03.2017).
86
29. Официальный сайт Qt Creator [Электронный ресурс]. URL: https://www.qt.io/ide/ (дата
обращения 07.04.2017)
30. Официальный сайт NetBeans [Электронный ресурс]. URL: https://netbeans.org (дата
обращения: 07.04.2017).
31. Официальный сайт Eclipse CDT [Электронный ресурс]. URL: https://eclipse.org/cdt/
(дата обращения: 15.04.2017).
32. Новое поколение систем контроля версий [Электронный ресурс] - Доступ к ст.:
http://www.techinfo.net.ru/docs/Version_Control_Systems.html.
33. Jim
Blandy.
Version
Control
with
CVS.
[Электронная
книга].
URL:
http://citforum.ru/programming/digest/cvsintrorus.shtml.
34. Available CVS Alternatives [Электронный ресурс] - Доступ к ст.: http://betterscm.berlios.de/aegis/.
35. Бен Коллинз-Сассман, Брайан У. Фитцпатрик, К. Майкл Пилато. Управление
версиями в Subversion [Электронная книга]. URL: http://kharchuk.ru/svn.html
36. Чакон С. Штрауб Б. "Git для профессионального программиста". – Питер, 2016 – 496с.
37. Bryan O'Sullivan. Mercurial: The Definitive Guide. — O'Reilly Media, Inc., 2009. — 288 с.
38. TortoiseSVN the coolest interface to (Sub) version control [Электронный ресурс]. URL:
https://tortoisesvn.net/status.html.
39. Вигерс К., Разработка требований к программному обеспечению [Текст] / Вингерс К.
- Пер. с англ. – М.: «Русская Редакция», 2004. – 576 с.
40. Бадд Т. Объектно-ориентированное программирование [Электронный ресурс]. URL:
http://kit.znu.edu.ua/iLec/9sem/OOP/lit/Badd_T__obektno_orienntirovannoe_programmirovanie.pdf (дата обращения 15.04.2017).
41. STL Documentation [Электронный ресурс]. URL: https://www.sgi.com/tech/stl/(дата
обращения: 28.04.2017).
42. Мартин Р. Чистый код. Создание, анализ и рефакторинг. Библиотека программиста. –
СПб.: Питер, 2014. – 464 с.
43. Google
C++
Style
Guide
[Электронный
ресурс].
–
режим
доступа:
https://google.github.io/styleguide/cppguide.html. Дата обращения: 09.05.2017.
44. Stroustrup B. The C++ Programming Language [Текст] / B. Stroustrup Addison-Wesley 4th Edition -2013 – 1346 c.
87
45. Meyers S. Effective Modern C++. 42 Specific Ways to Improve Your Use of C++11 and
C++14 [Текст] / S. Meyers O'Reilly Media; 1 edition -2014 -336 с.
46. Bryan O'Sullivan. Mercurial: The Definitive Guide. – O'Reilly Media, Inc., 2009. – 288 с.
47. Плаксин М. А. Тестирование и отладка программ для профессионалов будущих и
настоящих [Текст] / М.А. Плаксин - М.: Бином. Лаборатория знаний, 2007.
48. Отладка в Visual Studio [Электронный ресурс] / MSDN – Сеть разработчиков Microsoft
URL:
https://msdn.microsoft.com/ru-ru/library/sc65sadd.aspx
(дата
обращения:
14.05.2016).
49. Dr. Memory Documentation [Электронный ресурс]. URL: http://www.drmemory.org/
(дата обращения: 28.04.2017).
50. Jesse Russell. Administrative Review Board. — 2013 [Электронный ресурс]. URL: http://
literaturi.ru/books/administrative-review-board_27176939.html.
51. Алексей Пахунов Рецензирование кода (code review) (рус.). — 2007. [Электронный
ресурс]. URL: https://blog.not-a-kernel-guy.com/2007/02/21/151/.
52. Карпов Андрей. Построение систем автоматического протоколирования Си/Си++
кода - 2012.
53. Майерс Г., Искусство тестирования программ [Текст]/ Г. Майерс, Т. Баджетт, К.
Сандлер -3-еиздание - М.: «Диалектика», 2012. - 272 с.
54. Модульное тестирование кода. [Электронный ресурс]. -
Режим доступа:
https://msdn.microsoft.com/ru-ru/library/dd264975.aspx
55. Бейзер Б. Тестирование черного ящика. Технологии функционального тестирования
программного обеспечения и систем [Текст] / Б. Бейзер – Питер, 2004. – 320 с.
56. С. Канер, Д. Фолк, Е. К. Нгуен, Тестирование программного обеспечения, 2006 .
57. Jenkins 1.396 released, The first release of Jenkins is posted, Kohsuke Kawaguch», 2012.
58. Windows Performance Analyzer Documentation [Электронный ресурс]. URL:
https://msdn.microsoft.com/en-us/library/windows/hardware/hh448170.aspx
(дата
обращения: 10.05.2017).
59. Beginners Guide to Performance Profiling Tools [Электронный ресурс]. URL:
https://msdn.microsoft.com/ en-us /library/ms182372.aspx (дата обращения: 10.05.2017).
60. ГОСТ 19.101-77 ЕСПД. Виды программ и программных документов.
61. ГОСТ 19.201-78 ЕСПД. Техническое задание. Требования к содержанию и
оформлению [Текст].
88
62. ГОСТ 19.504-79 ЕСПД. Руководство программиста. Требования к содержанию и
оформлению[Текст].
63. ГОСТ 19.701-90 Схемы алгоритмов, программ, данных и систем
http://www.pntd.ru/19.701.htm.
89
ПРИЛОЖЕНИЕ 1
МИНОБРНАУКИ РОССИИ
Федеральное государственное автономное образовательное учреждение высшего
образования
«Национальный исследовательский университет
«Московский институт электронной техники»
Факультет микроприборов и технической кибернетики
Кафедра информатики и программного обеспечения вычислительных систем
УТВЕРЖДАЮ
Зав. кафедрой ИПОВС НИУ МИЭТ
д.т.н., проф________/Л.Г. Гагарина/
«___»_____________________20__г
Техническое задание на разработку
«Программный модуль генерации изображений номерных знаков автомобилей»
(шифр ПМ ГИНЗА)
Направление подготовки – 09.03.04
Квалификация – бакалавр
Руководитель ВКР _____________/к.т.н., доцент кафедры ИПОВС Кононова А.И./
Студент гр. МП-45_____________/ Кузьмина В.В./
Листов 8
Москва 2017
90
Введение
В
современном
увеличивающимся
мире
невозможно
автомобильным
представить
потоком
без
контроль
технологии
за
постоянно
распознавания
регистрационных знаков автомобилей. Одним из подходов к распознаванию изображений
символов автомобильного номера является использование свёрточных нейронных сетей.
Алгоритмы распознавания номерных знаков транспортных средств должны быть устойчивы
к искажениям изображений номерных пластин, связанным со скоростью движения
автомобилей и положением камеры относительно номерного знака. Одной из проблем
распознавания автомобильных номеров является разнообразие их видов, отличающихся
начертанием символов и размерами номерных пластин. Для обучения нейронной сети
требуется качественная и большая выборка изображений автомобильных знаков. Но иногда
сложно получить достаточное количество примеров изображений номерных знаков
определённого вида с помощью реальных съёмок. Одним из возможных решений может
быть программная генерация таких изображений.
В настоящее время уже существуют различные программы для создания проективно
преображённых изображений. Однако они предоставляют куда больше функций, чем
требуется для выполнения этой задачи и требуют обрабатывать каждое изображение в
отдельности, что приводит к большим временным затратам.
Задача, поставленная в АО «ЭЛВИС-НеоТек», требует разработки принципиально
нового программного модуля генерации синтетической обучающей выборки для обучения
нейронных сетей. Основанием для постановки такой задачи служат работы АО «ЭЛВИСНеоТек», в рамках разработки нейросетевого алгоритма распознавания государственных
регистрационных номерных знаков автомобилей.
1. Основания для разработки
1.1. Основание для разработки
задание на ВКР;
решение заведующего кафедрой ИПОВС.
91
1.2. Наименование работы и её шифр
Программный модуль генерации изображений номерных знаков автомобилей;
ПМ ГИНЗА.
2. Назначение разработки
ПМ ГИНЗА предназначен для генерации синтетической обучающей выборки
нейронной сети, распознающей государственные регистрационные автомобильные знаки.
3. Требования к программе или программному изделию
3.1. Требования к функциональным характеристикам
3.1.1. Состав выполняемых функций
ПМ ГИНЗА должен обеспечить выполнение следующих функций:
создание изображения регистрационного номерного знака автомобиля в соответствии
со стандартами:
4) ГОСТ Р 50577-93 для номерных знаков РФ.
5) SI 5327 для номерных знаков Израиля.
6) СТ РК 986-2003 для номерных знаков Республики Казахстан.
генерацию изображений номерных знаков без искажений со случайными номерами с
равномерным распределением символов в каждой позиции;
симуляцию крепёжных болтов на изображении номерного знака;
«затенение» части номерной пластины;
генерацию из каждого неискажённого изображения случайного номерного знака
проективно преобразованных изображений;
сохранение сгенерированных изображений.
3.1.2. Организация входных и выходных данных
Входные данные представляют собой три параметра:
путь к директории для сохранения сгенерированных изображений;
92
индекс нужного для генерации вида номерного знака (описание индексов
представлено в Приложении 4);
количество генерируемых перспективно преобразованных изображений номерных
знаков со случайными номерами.
Входная информация должна вводиться пользователем одним из двух способов.
Первый способ - использование графического пользовательского интерфейса. Второй
способ - с помощью интерфейса командной строки, указав параметры запуска в форме:
<директория><индекс><количество>.
Выходные
данные
для
ПМ
ГИНЗА
представляют
собой
перспективно
преобразованные изображения номерных знаков автомобилей, со случайными символами
номера. Сгенерированные изображения сохраняются в формате JPEG с эталонным именем
(имя должно содержать номер автомобильного знака, представленного на изображении).
3.2. Требования к надежности
ПМ ГИНЗА предназначен для коммерческого применения в составе программного
продукта распознавания государственных регистрационных номерных знаков автомобилей.
В связи с этим, главными требованиями к надежности являются стабильность и скорость
работы, а также корректность выходных данных. Для обеспечения надежности в
программном модуле должны быть предусмотрены:
отображение сообщений об ошибках при неверно заданных входных данных;
отображение сообщений об ошибках при отсутствии доступа к файловой системе;
минимизация количества операций чтения записи на диск;
использование библиотек OpenСV, Boost;
отображение сообщений об ошибках при сбоях в работе, например, об ошибках
переполнения диска.
3.3. Условия эксплуатации и требования к составу и параметрам технических средств
Требования, предъявляемые к составу и параметрам технических средств
представлены в таблицах 1 и 2.
93
Таблица 1
Минимальный состав технических средств
и их технические характеристики
IntelCore i3
Процессор
Оперативная память
1 Гб
Операционная система
Microsoft Windows 7 и выше
Объём свободного места на жёстком диске
1 Гб
Разрешение экрана
1280 х 1024 пикселов
Манипулятор мышь
с интерфейсом PS/2 или USB
Клавиатура
101/102-х клавишная рус./лат.
Таблица 2
Рекомендуемый состав технических средстви
и их технические характеристики
IntelCore i7
Процессор
Оперативная память
2 Гб
Операционная система
Microsoft Windows 7 и выше
Объём свободного места на жёстком диске
2 Гб и более
Разрешение экрана
1280 х 1024 пикселов
Манипулятор мышь
с интерфейсом PS/2 или USB
Клавиатура
101/102-х клавишная рус./лат.
3.4. Требования к информационной и программной совместимости
ПМ ГИНЗА должен работать под операционной системой Windows 7 и выше.
Среда разработки – Microsoft Visual Studio Professional 2015.
Должен обеспечиваться доступ к файловой системе на запись, чтение и удаление
файлов.
4. Требования к программной документации
Вместе с ПМ ГИНЗА должен быть разработан документ:
«Руководство оператора» по ГОСТ 19.505-79.
94
5. Технико-экономические показатели
Основным назначением разрабатываемого модуля является генерация изображений
номерных пластин автомобилей для обучения нейросетевого алгоритма распознавания
государственных регистрационных знаков транспортных средств. Данный программный
модуль позволяет существенно сократить время создания обучающей выборки для
нейронных сетей.
6. Стадии и этапы разработки
В течение учебной практики должны быть проведены следующие работы,
представленные в таблице 3.
Таблица 3
Стадии и этапы разработки
№
Наименование работы
Дата начала
Дата окончания Форма отчетности
1
Постановка задачи
13.02.2017
18.02.2017
2
Исследование предметной
13.02.2017
20.02.2017
области
Сравнительная
таблица
3
Разработка ТЗ
20.02.2017
27.02.2017
Утвержденное ТЗ
4
Определение
27.02.2017
07.03.2017
Схема данных
07.03.2017
16.03.2017
Схема алгоритма
16.03.2017
21.03.2017
Уточненная схема
предварительной структуры
входных и выходных
данных
5
Разработка алгоритма
работы программного
модуля
6
Уточнения структуры
входных и выходных
данных
данных
95
7
8
Определения формы
21.03.2017
26.03.2017
Список входных,
представления входных,
выходных и
выходных и
промежуточных
промежуточных данных
данных
Определение среды
26.03.2017
04.04.2017
написания программы,
Конфигурация
технических средств
выбор языка
программирования
9
Разработка человеко-
04.04.2017
23.04.2017
машинного интерфейса
10
Разработка программного
форм
04.04.2017
24.04.2017
модуля
11
Отладка программного
Эскизы экранных
Тексты программ с
комментариями
24.04.2017
04.05.2017
Текстовый документ
04.05.2017
17.05.2017
Тест-кейс
17.05.2017
18.05.2017
Результаты
модуля
12
Разработка программы и
методики испытаний
13
Проведение испытаний
испытаний
14
Корректировка программ и
18.05.2017
21.05.2017
документов по результатам
Скорректированные
документы
испытаний
15
Разработка пояснительной
21.05.2017
31.06.2017
записки ВКР
16
Разработка руководства
Пояснительная
записка
31.06.2017
02.06.2017
Презентация
оператора
96
8. Порядок контроля и приемки
Для ПМ ГИНЗА должны быть разработаны тесты и проведена отладка, а также
должна быть разработана контрольно-демонстрационная задача, в которой должно
проверяться выполнение всех функций программы.
Студент гр. МП – 45 ______________/ Кузьмина В.В./
«___»__________2017 г.
97
ПРИЛОЖЕНИЕ 2
ПРОГРАММНЫЙ МОДУЛЬ ГЕНЕРАЦИИ ИЗОБРАЖЕНИЙ
НОМЕРНЫХ ЗНАКОВ АВТОМОБИЛЕЙ (ПМ ГИНЗА)
РУКОВОДСТВО ОПЕРАТОРА
Листов 24
Москва, 2017
98
АННОТАЦИЯ
В данном программном документе приведено руководство оператора по эксплуатации ПМ
ГИНЗА, генерирующего синтетические обучающие выборки для нейросетевых алгоритмов
распознавания государственных регистрационных знаков автомобилей.
В разделе «Назначение программы» указаны сведения о назначении программы и
информация, достаточная для понимания функций программы и ее эксплуатации.
В разделе «Условия выполнения программы» указаны условия, необходимые для
выполнения программы.
В разделе «Выполнение программы» указана последовательность действий оператора,
обеспечивающих загрузку, запуск и выполнение программы, приведено описание функций,
формата и возможных вариантов команд, с помощью которых оператор осуществляет
загрузки и управляет выполнением программы, а также ответы программы на эти команды.
В разделе «Сообщения оператору» приведены тексты сообщений, выдаваемых в ходе
выполнения программы, описание их содержания и соответствующие действия оператора.
Оформление
программного
документа
«Руководство
оператора»
произведено
по
требованиям ЕСПД (ГОСТ 19.101-77, ГОСТ 19.103-77, ГОСТ 19.104-78, ГОСТ 19.105-78,
ГОСТ 19.106-78, ГОСТ 19.505-79).
99
СОДЕРЖАНИЕ
АННОТАЦИЯ ............................................................................................................................... 98
1. НАЗНАЧЕНИЕ ПРОГРАММЫ ............................................................................................ 102
1.1 Функциональное назначение .......................................................................................... 102
1.2 Эксплуатационное назначение ....................................................................................... 102
1.3 Состав функций ................................................................................................................ 102
1.3.1 Функция генерации изображения номерного знака со случайным номером ..... 102
1.3.2 Функция симуляции крепежных болтов на изображении .................................... 102
1.3.3 Функция перспективного преобразования изображений ...................................... 103
1.3.4 Функция сохранения изображений ......................................................................... 103
2. УСЛОВИЯ ВЫПОЛНЕНИЯ ПРОГРАММЫ ...................................................................... 104
2.1 Требования к программным средствам.......................................................................... 104
2.2 Требования к аппаратным средствам ............................................................................. 104
2.3 Требования к персоналу (пользователю) ....................................................................... 104
3. ВЫПОЛНЕНИЕ ПРОГРАММЫ ........................................................................................... 105
3.1 Загрузка и запуск программы ......................................................................................... 105
3.1.1 Запуск ПМ ГИНЗА из командной строки ............................................................... 105
3.1.2 Запуск графического интерфейса ПМ ГИНЗА ...................................................... 105
3.2 Выполнение программы .................................................................................................. 105
3.2.1 Выполнение программы при запуске из командной строки ................................. 106
3.2.2 Выполнение программы при запуске пользовательского интерфейса ................ 107
3.3 Завершение работы программы ...................................................................................... 110
3.3.1 Завершение программы при запуске из командной строки .................................. 110
3.3.2 Завершение программы при запуске пользовательского интерфейса ................. 112
3.4 Описание функций ПМ ГИНЗА...................................................................................... 112
3.4.1 Ввод входных данных ............................................................................................... 113
3.4.2 Изменение параметров работы программы ............................................................ 115
100
3.4.3 Тестирование углов поворота и смещений изображения ..................................... 117
3.4.4 Запуск генерации изображений ............................................................................... 118
4. Сообщения оператору ............................................................................................................ 119
101
1. НАЗНАЧЕНИЕ ПРОГРАММЫ
1.1 Функциональное назначение
ПМ ГИНЗА реализует следующие функции: создание шаблона номерного знака, генерацию
знаков со случайными номерами, симуляцию крепежных болтов на номерных пластинах,
перспективное преобразование и сохранение сгенерированных изображений.
1.2 Эксплуатационное назначение
Основное назначение ПМ ГИНЗА – генерация синтетической обучающей выборки
нейросетевого алгоритма распознавания государственных регистрационных знаков
транспортных средств.
1.3 Состав функций
1.3.1 Функция генерации изображения номерного знака со случайным номером
Функция формирует изображение выбранного пользователем номера в соответствии со
стандартами, при этом для создания изображения используется случайный номер. Номер
генерируется в соответствии с регулярным выражением, определяющим допустимые с
точки зрения стандарта последовательности символов в автомобильном номере.
Полученные изображения сохраняются в каталоге, указанном пользователем, в папку
«Original images».
1.3.2 Функция симуляции крепежных болтов на изображении
Функция
симуляции
крепежных болтов предназначена
для
генерации
наиболее
реалистичных изображений. Данная функция добавляет на сгенерированное изображение
номерного знака несколько изображений крепежных болтов, расположенных в соответствии
со стандартами для каждого типа номерной пластины. Полученные изображения
сохраняются в каталоге, указанном пользователем в папку «Fastening screw simulation».
102
1.3.3 Функция перспективного преобразования изображений
Данная функция подвергает каждое сгенерированное изображение перспективному
преобразованию с помощью матриц поворота. При этом, производится симуляция
равномерного изменения положения камеры относительно номерной пластины в
трехмерном пространстве. Искаженные изображения также сохраняются. Полученные
изображения сохраняются в каталоге, указанном пользователем в папку «Transformed
image».
1.3.4 Функция сохранения изображений
Данная функция позволяет сохранять автосгенерированные изображения в директорию,
указанную пользователем. Каждое изображение сохраняется с эталонным именем (имя
содержит номер автомобильного знака, представленного на изображении).
103
2. УСЛОВИЯ ВЫПОЛНЕНИЯ ПРОГРАММЫ
2.1 Требования к программным средствам
Системные программные средства, используемые данным ПМ ГИНЗА, должны быть
представлены актуальной локализованной версией операционной системы Microsoft
Windows (7 или старше).
2.2 Требования к аппаратным средствам
Минимальный состав используемых технических (аппаратных) средств:
оперативная память 2 ГБ;
дисковое пространство - не менее 2 ГБ свободного места на диске;
разрешение экрана - 1280x1024 пикселов;
манипулятор мышь с интерфейсом PS/2 или USB;
клавиатура 101/102-x клавишная рус/лат.
2.3 Требования к персоналу (пользователю)
Конечный пользователь программы (оператор) должен обладать практическими навыками
работы с графическим пользовательским интерфейсом операционной системы.
104
3. ВЫПОЛНЕНИЕ ПРОГРАММЫ
3.1 Загрузка и запуск программы
Для
установки
ПМ
ГИНЗА
необходимо
скопировать
исполняемый
файл
LPImageGenerator.exe и конфигурационный файл с параметрами default_params.ini в одну
директорию. Запустить ПМ ГИНЗА можно двумя способами. Первый способ – с помощью
командной строки. Второй способ – использование графического интерфейса.
3.1.1 Запуск ПМ ГИНЗА из командной строки
Из командной строки необходимо вызвать программу LPImageGenerator.exe, указав
параметры запуска в форме:
<директория> <индекс> <количество>,
где
директория – абсолютный путь директории для сохранения выходных данных;
индекс – индекс генерируемого вида номерных знаков (описание индексов
представлено в Приложении 4);
количество – целое неотрицательные число, обозначающее количество генерируемых
изображений.
Затем следует нажать клавишу «Enter».
3.1.2 Запуск графического интерфейса ПМ ГИНЗА
Для запуска программы в графическом режиме необходимо выполнить двойное нажатие
левой кнопки мыши по исполняемому файлу LPImageGenerator.exe.
3.2 Выполнение программы
Выполнение программы состоит из двух этапов:
приём входных параметров;
генерация перспективно преобразованных изображений номерных знаков со
случайными символами номера.
105
3.2.1 Выполнение программы при запуске из командной строки
а) Приём входных параметров
После ввода входных параметров – абсолютный путь директории для сохранения выходных
данных, индекс генерируемого вида номерных знаков,
количество генерируемых
изображений – и нажатия клавиши «Enter» ПМ ГИНЗА начинает выполнять их проверку.
Если пользователь ввел больше или меньше трёх входных параметров при запуске
программы, то в консоли появится сообщение об ошибке – «Command line arguments:
<path_to_save_images> <index_type_of_license_plate> <number_of_ pictures_to_generate>».
Если пользователь ввел первым параметром некорректный абсолютный путь, то в консоли
появится сообщение об ошибке – «The first argument is failed. Please enter the full path to the
directory».
Если пользователь ввел вторым параметром несуществующий индекс генерируемого типа
номерного знака (описание индексов представлено в Приложении 4), то в консоли появится
сообщение об ошибке – «The second argument is failed. Please enter the correct index of the kind
of license plate».
Если пользователь ввел последним параметром не целое неотрицательное число, то в
консоли появится сообщение об ошибке – «The third argument is failed. Please enter a positive
integer».
В случае успешной проверки, когда все входные параметры введены корректно, программа
автоматически перейдёт в режим генерации изображений.
б) Генерация проективно преобразованных изображений
После успешного запуска программы, ПМ ГИНЗА начнёт генерировать перспективно
преобразованные
изображения
номерных
знаков,
в
соответствии
с
выбранным
пользователем видом номеров, со случайным символами номера. Символы номера
генерируется в соответствии с регулярным выражением, определяющим допустимые с
точки зрения стандарта последовательности символов в выбранном автомобильном номере.
На генерируемые изображения номерных знаков добавляются несколько изображений
крепежных
болтов.
Далее
каждое
сгенерированное
изображение
подвергается
перспективному преобразованию, симулируя равномерное изменения положения камеры
106
относительно
номерного
знака.
Прогресс
процесса
генерирования
изображений
отображается в консоли. Количество успешно созданных изображений постепенно
выводится в консоль в ходе работы ПМ ГИНЗА. Пример выводимого в ходе работы ПМ
ГИНЗА в консоли текста:
num_files=50000
5000 10000 15000 20000 25000 30000 35000 40000 45000 50000
time = 24.7154 ms
finished
Сгенерированные изображения сохраняются в указанную пользователем директорию с
эталонным именем (имя содержит номер автомобильного знака, представленного на
изображении). Пример эталонного имени: «1_ru_ K916KA177.png».
3.2.2 Выполнение программы при запуске пользовательского интерфейса
а) Приём входных параметров
После запуска ПМ ГИНЗА в графическом режиме на экране появится окно ввода входных
параметров, пример которого приведен на рисунке 1.
Рисунок 1 Окно ввода входных параметров
В данном окне в соответствующих полях будут отображаться директория для сохранения
выходных данных, индекс генерируемого вида номерных знаков и количество
генерируемых изображений (рисунок 1). Оператору необходимо ввести абсолютный путь к
директории для сохранения сгенерированных изображений, индекс нужного для генерации
107
вида номерных знаков (описание индексов представлено в Приложении 4) и количество
генерируемых изображений – целое неотрицательное число.
В
графическом
режиме
можно
изменить
параметры
конфигурационного
файла
default_params.ini, для этого надо нажать кнопку «Дополнительные параметры» в окне ввода
входных данных (пункт 3.4.2).
Для начала процесса генерации изображений номерных знаков необходимо нажать кнопку
«Запуск» (рисунок 1). После нажатия кнопки «Запуск» ПМ ГИНЗА начинает выполнять
проверку введённых пользователем входных параметров.
Если пользователь оставил какие-то из полей незаполненными, то при нажатии кнопки
«Запуск», появится окно с сообщением об ошибке: «Необходимо заполнить все поля ввода»
(рисунок 2).
Рисунок 2 Информационное окно с сообщением о незаполненности всех
входных
параметров
Если пользователь ввел в поле «Укажите директорию для сохранения» (рисунок 1)
некорректный абсолютный путь к каталогу, в котором будут сохранены сгенерированные
изображения, то при нажатии кнопки «Запуск», появится окно с сообщением об ошибке:
«Путь к каталогу для сохранения сгенерированных изображений должен быть абсолютным»
(рисунок 3).
Рисунок 3 Информационное окно с сообщением об ошибке при
указании
директории для сохранения выходных данных
108
Если пользователь ввел в поле «Выберите вид номерного знака» (рисунок 1)
несуществующий индекс (описание индексов представлено в Приложении 4), то при
нажатии кнопки «Запуск», появится окно с сообщением об ошибке: «Указан
несуществующий вид номерного знака» (рисунок 4).
Рисунок 4 Информационное окно с сообщением о вводе несуществующего
индекса вида номерных знаков
Если пользователь ввел в поле «Введите количество изображений» (рисунок 1) не целое
положительное число, то при нажатии кнопки «Запуск», появится окно с сообщением об
ошибке: «Количество генерируемых изображений должно быть целым положительным
числом» (рисунок 5).
Рисунок 5 Информационное окно с сообщением о вводе некорректного
числа
изображений, необходимых для генерации
В случае успешной проверки, когда все входные параметры введены корректно, при
нажатии кнопки «Запуск» программа автоматически начнёт генерацию изображений.
б) Генерация проективно преобразованных изображений
После успешного запуска программы, ПМ ГИНЗА начнёт генерировать перспективно
преобразованные
изображения
номерных
знаков,
в
соответствии
с
выбранным
пользователем видом номерных знаков, со случайным символами номера. Символы номера
генерируется в соответствии с регулярным выражением, определяющим допустимые с
точки зрения стандарта последовательности символов в выбранном автомобильном номере.
109
На генерируемые изображения номерных знаков добавляются несколько изображений
крепежных
болтов.
Далее
каждое
сгенерированное
изображение
подвергается
перспективному преобразованию, симулируя равномерное изменения положения камеры
относительно
номерного
знака.
Прогресс
процесса
генерирования
изображений
отображается в консоли. Сгенерированные изображения сохраняются в указанную
пользователем директорию с эталонным именем (имя содержит номер автомобильного
знака, представленного на изображении). По завершении генерации изображений окно
ввода входных данных закроется и появится информационное сообщение с результатами
работы, показанное на рисунке 6.
Рисунок 6 Информационное окно с результатами работы ПМ ГИНЗА
3.3 Завершение работы программы
3.3.1 Завершение программы при запуске из командной строки
После завершения работы программы в консоли появится сообщение «finished». Для
закрытия консоли следует нажать стандартную кнопку закрытия, расположенную в правом
верхнем углу окна команд или ввести команду «exit».
Для принудительного завершения программы из командной строки Microsoft Windows
следует использовать сочетание клавиш [Ctrl]+[C]. Ещё одним способ принудительного
завершения работы ПМ ГИНЗА является завершение через диспетчер задач. Для этого
следует открыть диспетчер задач сочетанием клавиш [Ctrl]+[Shift]+[Esc], выделить процесс
LPImageGenerator.exe и нажать кнопку «Завершить процесс» (рисунок 7).
110
Рисунок 7 Завершение программы через диспетчер задач
После нажатия кнопки «Завершить процесс» появится информационное информационное
окно с вопросом подтверждения завершения приложения. Пример данного окна приведён
на рисунке 8.
Рисунок 8 Завершение программы через диспетчер задач
По нажатию кнопки «Завершить процесс» (рисунок 8) приложение LPImageGenerator.exe
принудительно завершиться.
111
3.3.2 Завершение программы при запуске пользовательского интерфейса
По завершении генерации изображений окно ввода входных данных (рисунок 1) закроется
и появится информационное сообщение с результатами работы, показанное на рисунке 9.
Рисунок 9 Информационное окно с результатами работы ПМ ГИНЗА
По нажатию кнопки «Ок» (рисунок 9) ПМ ГИНЗА сохранит данные, введённые оператором,
и завершит свою работу.
Для принудительного завершения программы в окне ввода входных данных, приведенном
на рисунке 10, необходимо нажать кнопку «Отмена» или стандартную кнопку закрытия,
расположенную в правом верхнем углу окна.
Рисунок 10 Окно ввода входных параметров
После этого окно ввода входных данных закроется, и программа остановит генерацию
изображений. Изображения, которые были сгенерированы до принудительного завершения
работы ПМ ГИНЗА, будут сохранены в директории, указанной пользователем в поле
«Укажите директорию для сохранения» (рисунок 10).
3.4 Описание функций ПМ ГИНЗА
112
Пользовательский интерфейс (UI) ПМ ГИНЗА позволяет выполнять следующие функции:
ввод входных данных;
изменение параметров проективного преобразования изображений;
тестирование углов поворота и смещений изображения;
запуск генерации изображений.
3.4.1 Ввод входных данных
Входные данные вводятся с помощью окна с параметрами запуска ПМ ГИНЗА (рисунок 11).
Рисунок 11 Окно ввода входных параметров
В поле «Укажите директорию для сохранения» необходимо ввести путь к каталогу, в
котором будут сохранены сгенерированные изображения. Для указания директории можно
воспользоваться кнопкой «Обзор», после клика по которой появится стандартное окно
Windows обзора файлов и папок. Пример такого окна приведён на рисунке 12. Для выбора
директории для сохранения сгенерированных изображений, следует выделить подходящий
каталог, или создать его нажатием кнопки «Создать папку», и нажать кнопку «Ок».
113
Рисунок 12 Стандартное окно обзора файлов и папок в MS Windows
В поле «Выберите вид номерного знака» (рисунок 11) необходимо указать индекс нужного
для генерации вида номерной пластины (описание индексов представлено в Приложении 4).
Для выбора индекса можно воспользоваться кнопкой «Обзор», расположенной в
соответствующей строке. После клика по этой кнопке появится окно выбора вида номерного
знака (рисунок 13).
Рисунок 13 Окно выбора генерируемых видов номеров
114
Для выбора индекса генерируемых номерных знаков, необходимо кликнуть на один из
индексов и нажать на кнопку «Ок». Закрыть окно можно нажатием кнопки «Отмена» или
стандартной кнопки закрытия, расположенной в правом верхнем углу окна.
В поле «Введите количество изображений» (рисунок 11) необходимо указать целое,
положительное число сгенерированных изображений.
Если какие-то из входных параметров указаны некорректно, то при нажатии на кнопку
«Запуск», появится информационное сообщение с описанием ошибки. Закрыть окно можно
нажатием кнопки «Отмена» или стандартной кнопки закрытия, расположенной в правом
верхнем углу окна программы.
3.4.2 Изменение параметров работы программы
Параметры перспективного преобразования изображений для ПМ ГИНЗА хранятся в
конфигурационном файле default_params.ini, поставляемом вместе с приложением. Это
простой текстовый файл, хранящий значения некоторых параметров, которые влияют на
работу ПМ ГИНЗА, но меняются крайне редко. В конфигурационном файле описываются
максимальные углы поворотов, шаги углов поворотов, максимальные смещения и шаги
перемещения изображения вдоль осей координат. Изменить эти параметры можно либо
отредактировав файл вручную. Для открытия файла default_params.ini, следует нажать на
него правой клавишей мыши, в появившемся всплывающем меню выберите пункт «Открыть
с помощью» и выберите любой текстовый редактор. Либо воспользоваться окном настройки
параметров (рисунок 14).
115
Рисунок 14 Окно настройки параметров работы программы
Для того, чтобы открыть окно настройки параметров перспективного преобразования
генерируемых изображений, необходимо нажать на кнопку «Дополнительные настройки» в
окне ввода входных данных (рисунок 11).
При открытии окна с дополнительными настройками (рисунок 14) в полях ввода записаны,
используемые на данный момент, значения параметров. Вводимые значения должны быть
целыми числами, а минимальное значения каждого из углов или смещений должно быть
меньше максимально, если шаг положительный, и соответственно наоборот. Также ни одно
из полей ввода не должно оставаться пустым. При нарушении этих правил, при нажатии на
кнопку «Ок», появится информационное сообщение с описанием ошибок. Пример такого
сообщения приведен на рисунке 15.
Рисунок 15 Информационное окно с сообщением о незаполненности
всех
входных параметров
116
Чтобы сохранить введённые параметры, следует нажать на кнопку «Ок». После нажатия
кнопки «Ок», ПМ ГИНЗА изменит значения параметров в конфигурационном файле
настроек default_params.ini на введённые оператором. Если сохранять изменения нет
необходимости, то закрыть окно можно нажатием кнопки «Отмена» или стандартной
кнопки закрытия, расположенной в правом верхнем углу окна программы.
3.4.3 Тестирование углов поворота и смещений изображения
ПМ ГИНЗА позволяет отображать генерируемые изображения. При настройке параметров
перспективного
преобразования
(рисунок
14),
может
возникнуть
необходимость
протестировать углы поворота и смещения изображений. Для отображения изображения
искажённого в соответствии с указанными параметрами, можно воспользоваться окном
тестирования углов поворота и смещений изображения (рисунок 16).
Рисунок 16 Окно тестирования углов поворотов и смещений изображения
Для того, чтобы открыть это окно, необходимо нажать на кнопку «Тестирование
параметров» в окне настройки параметров работы программы (рисунок 14). В левой части
окна можно ввести углы поворотов и смещения изображения вдоль осей координат. Все
вводимые параметры должны быть целыми числами, и ни одно из полей ввода не должно
оставаться пустым. При нарушении этих правил, при нажатии на кнопку «Обновить»,
появится информационное сообщение с описанием ошибки. Если все поля ввода заполнены
корректно, то при нажатии на кнопку «Обновить», в правой части окна будут отображаться
сгенерированные, в соответствии с задаваемыми параметрами, изображения. Закрыть окно
117
можно нажатием кнопки «Отмена» или стандартной кнопки закрытия, расположенной в
правом верхнем углу окна программы.
3.4.4 Запуск генерации изображений
Генерация изображений начнётся после нажатия на кнопку «Запуск» в окне ввода входных
данных (рисунок 17).
Рисунок 17 Окно ввода входных параметров
Для того, чтобы прервать работу программы, можно нажать кнопку «Отмена» или
стандартную кнопку закрытия, расположенную в правом верхнем углу окна программы.
Выходные данные для ПМ ГИНЗА представляют собой графические изображения
перспективно
преобразованных
номерных
знаков
автомобилей.
Сгенерированные
изображения сохраняются в директории, указанной пользователем, в формате JPEG с
эталонным именем (имя содержит номер автомобильного знака, представленного на
изображении), например, «1_ru_ K916KA177.png».
118
4. СООБЩЕНИЯ ОПЕРАТОРУ
В таблице 1 указан перечень сообщений, которые появляются в случае неисправности ПМ
ГИНЗА при запуске в консольном режиме.
Таблица 1
Перечень возможных неисправностей при работе в консольном режиме
Наименование неисправностей и
Вероятная причина
Способ устранения
текст выводимых сообщений
При передаче входных параметров
Были введены больше Ввести три требуемых
может появиться сообщение
или меньше трёх
входных параметра и
«Command line arguments:
входных параметров
повторить попытку запуска
При передаче входных параметров
Первым параметром
Ввести первым параметром
может появиться сообщение «The
был введен
абсолютный путь к
first argument is failed. Please enter
некорректный
директории для сохранения
the full path to the directory»
абсолютный путь
изображений
При передаче входных параметров
Вторым параметром
Ввести вторым параметром
может появиться сообщение «The
был введен
корректный индекс
second argument is failed. Please
несуществующий
генерируемого вида
enter the correct index of the kind of
индекс
номерных знаков (индексы
license plate»
генерируемого вида
описаны в Приложении 4)
<path_to_save_images>
<index_type_of_license plate>
<number_of_pictures_to_generate>»
номерных знаков
При передаче входных параметров
Третьим параметром
Ввести третьим параметром
может появиться сообщение «The
было введено не
количество генерируемых
third argument is failed. Please enter a целое положительное
изображений (целое
positive integer»
число
положительно число)
После запуска ПМ ГИНЗА может
Ошибка в параметрах
Ввести в файле настроек
появиться сообщение «Error in
в файле
корректные параметры
configuration file with parameters»
default_params.ini
искажения изображений
119
В таблице 2 указан перечень сообщений, которые появляются в случае неисправности
работы ПМ ГИНЗА в режиме графического интерфейса.
Таблица 2
Перечень возможных неисправностей ПМ ГИНЗА при работе
в
режиме графического интерфейса
Тип неисправностей и текст
Вероятная причина
Способ устранения
сообщений в всплывающих
информационных окнах
При запуске может появиться
Не были заполнены все
Ввести три требуемых
сообщение «Необходимо
поля ввода входных
входных параметра в
заполнить все поля ввода»
параметров
соответствующих полях
ввода и повторить
попытку запуска
При запуске может появиться
В поле «Укажите
Ввести в поле «Укажите
сообщение «Путь к каталогу
директорию для
директорию для
для сохранения
сохранения» введен не
сохранения» полный путь
сгенерированных сообщений
абсолютный путь к
к каталогу для сохранения
должен быть абсолютным»
директории для
сгенерированных
сохранения
изображений
При запуске может появиться
В поле «Выберите вид
Ввести в поле «Выберите
сообщение «Указан
номерного знака» введен
вид номерного знака»
несуществующий вид
некорректный индекс
корректный индекс
номерного знака»
генерируемого вида
генерируемого вида
номерных знаков
номерных знаков (индексы
описаны в Приложении 4)
При запуске может появиться
В поле «Введите
Ввести в поле «Введите
сообщение «Количество
количество изображений»
количество изображений»
генерируемых изображений
введено не целое
целое положительно
должно быть целым
положительное число
число, обозначающее
положительным числом»
количество генерируемых
изображений
120
Продолжение таблицы 2
Тип неисправностей и текст
Вероятная причина
Способ устранения
сообщений в всплывающих
информационных окнах
После запуска ПМ ГИНЗА
Ошибка в параметрах в
Ввести в файле настроек
может появиться сообщение
конфигурационном
корректные параметры
«Ошибка в параметрах в
файле
искажения изображений с
конфигурационном файле
default_params.ini
помощью оконной формы с
дополнительных параметров
default_params.ini»
После нажатия кнопки «Ок» в
В окне настройки
Заполнить все поля ввода в
окне настройки параметров
параметров работы
окне настройки параметров
работы программы может
программы не были
работы программы и
появиться сообщение
заполнены все поля
повторно нажать кнопку
«Необходимо заполнить все
ввода
«Ок»
После нажатия кнопки «Ок» в
В поле «название поля
Ввести в поле «название поля
окне настройки параметров
ввода» введено не целое
ввода» целое число
работы программы может
число
поля ввода»
появиться сообщение «В поле
ввода <название_поля_ввода>
введено не целое число»
После нажатия кнопки «Ок» в
В полях ввода углов
Ввести в полях ввода углов
окне настройки параметров
поворота (смещений)
поворота (смещений) вдоль
работы программы может
вдоль оси X/Y/Z
оси X/Y/Z такие значения,
появиться сообщение
минимальное значение
чтобы минимальное значение
«Минимальное значение угла
данного параметра
данного параметра было
поворота (смещения) вдоль оси
больше максимального,
меньше максимального, при
X/Y/Z должно быть меньше
при положительно шаге, положительно шаге, и
максимального, при
и соответственно
положительно шаге», и
наоборот
соответственно наоборот
соответственно наоборот
121
ПРИЛОЖЕНИЕ 3
ПРОГРАММНЫЙ МОДУЛЬ ГЕНЕРАЦИИ ИЗОБРАЖЕНИЙ
НОМЕРНЫХ ЗНАКОВ АВТОМОБИЛЕЙ (ПМ ГИНЗА)
ТЕКСТ ПРОГРАММЫ
Листов 20
Москва, 2017
122
Содержание
1. Главная функция программы ............................................................................................................. 124
2. Модуль генерации изображения номерного знака по шаблону со случайным номером ............ 131
3. Модуль перспективного преобразования сгенерированных изображений ................................... 126
4. Пример файла с шаблоном генерируемого ПМ ГИНЗА изображения .......................................... 134
123
1.
Главная функция программы
// @brief Обрабатывает входные параметры и запускает генерацию
изображений
int
main(int argc, char* argv[])
{
const int kErrorRes = -1;
try
{
if (argc != 3)
{
std::cout << "Command line arguments:
<path_to_save_images>
<number_of_original_pictures_to_generate>" << std::endl;
return kErrorRes;
}
const bool kSaveOriginalLpImage = true;
boost::filesystem::path output_directory(argv[1]);
int number_of_car_plates = boost::lexical_cast<int>(argv[2]);
GenerateImages(number_of_car_plates, output_directory,
kSaveOriginalLpImage);
return 0;
}
catch (const std::exception& ex)
{
std::cerr << ex.what() << std::endl;
return kErrorRes;
}
catch (...)
{
std::cerr << "Unknown exception" << std::endl;
return kErrorRes;
}
}
124
// @brief Генрирует изображения автомобильных номеров
void GenerateImages(int number_of_car_plates, const
boost::filesystem::path& output_directory, bool
save_original_LP_image)
{
NumberGenerator generator;
ImageRotator image_rotator;
for (int j = 0; j < number_of_car_plates; ++j)
{
bool is_ok = generator.GenerateNextNumber();
if (!is_ok)
{
std::cerr << "Error. Failed to generate next number" <<
std::endl;
return;
}
// Формировании матрицы поворота
cv::Mat img =
CreateFlippedCVMat(generator.GetLicensePlateNumber());
if (save_original_LP_image)
{
// Формирование названия изображения
std::wstring filename = boost::str(boost::wformat(L"%d
%s.jpg") % j % generator.GetNumberString()).c_str();
SaveImage(img, output_directory /
boost::filesystem::path("OriginalImages"), filename);
}
// Генерирует перспективно преобразованные изображения
image_rotator.GenerateRotatedImages(img,
generator.GetNumberString(), output_directory);
}
}
return;
}
125
2. Модуль перспективного преобразования сгенерированных изображений
//@brief Создаёт перспективно преобразованное изображение
class ImageRotator
{
static const int kResultingWidth = 160;
static const int kResultingHeight = 80;
public:
ImageRotator();
/*
* @brief Генерирует и сохраняет проективно искажённые изображения
* @param [IN] input_image - исходное изображение для вращения
* @param [IN] number_string - автомобильный номер с входного
изображения
* @param [IN] output_dir - директория для сохранения
сгенерированных искажённых изображений
*/
void GenerateRotatedImages(const cv::Mat& input_image, const
std::wstring& number_string, const boost::filesystem::path&
output_dir);
private:
/*
* @brief Заполняет матрицу трансформации для
cv::warpPerspective()
* @param [IN] input_image - исходное изображение для поворота
* @param [IN] alpha, beta, gamma - угол поворота в градусах по
оси X, Y, Z соответственно
* @param [IN] dx, dy, dz - смещение по оси X, Y, Z соответственно
*/
void FillTransformationMatrix(const cv::Mat& input_image, double
alpha, double beta, double gamma, double dx, double dy, double
dz);
/*
* @brief Поворачивает входное изображение
* @param [IN] input_image - исходное изображение для поворота
126
* @param [IN] output_image - полученное в результате искажения
изображение
* @param [IN] alpha, beta, gamma, dx, dy, dz - см. выше
*/
void RotateImage(const cv::Mat &input_image, cv::Mat
&output_image, double alpha, double beta, double gamma, double
dx, double dy, double dz);
int m_image_index;
cv::Mat m_2D_to_3D_matrix;
//Affine transformations in 3D space
cv::Mat m_x_axis_rotation_matrix;
cv::Mat m_y_axis_rotation_matrix;
cv::Mat m_z_axis_rotation_matrix;
// Rotation matrix
(m_x_axis_rotation_matrix*m_y_axis_rotation_matrix*m_z_axis_rotat
ion_matrix)
cv::Mat m_rotation_matrix;
cv::Mat m_translation_matrix;
cv::Mat m_3D_to_2D_matrix;
cv::Mat m_resulting_transform_matrix;
};
ImageRotator::ImageRotator() : m_image_index(0){}
//@brief Поворачивает входное изображение
void ImageRotator::RotateImage(const cv::Mat &input_image, cv::Mat
&output_image, double alpha, double beta, double gamma, double dx,
double dy, double dz)
{
FillTransformationMatrix(input_image, alpha, beta, gamma, dx, dy,
dz);
cv::Mat s = output_image(cv::Range(40, 270), cv::Range(100,
600));
127
cv::warpPerspective(input_image, output_image,
m_resulting_transform_matrix, input_image.size(),
cv::INTER_LANCZOS4);
}
// @brief Заполняет матрицу трансформации для
void ImageRotator::FillTransformationMatrix(const cv::Mat
&input_image, double alpha, double beta, double gamma, double dx,
double dy, double dz)
{
double w_init = input_image.cols;
double h_init = input_image.rows;
// f - distance between camera and image
double f = input_image.cols / 2.0;
alpha = (alpha)*CV_PI / 180.;
beta = (beta)*CV_PI / 180.;
gamma = (gamma)*CV_PI / 180.;
m_2D_to_3D_matrix = (cv::Mat_<double>(4, 3) <<
kResultingWidth / w_init, 0, -kResultingWidth / 2.0,
0, kResultingHeight / h_init, -kResultingHeight / 2.0,
0, 0, 0,
0, 0, 1);
// Affine transformations in 3D space
m_x_axis_rotation_matrix = (cv::Mat_<double>(4, 4) <<
1, 0, 0, 0,
0, cos(alpha), -sin(alpha), 0,
0, sin(alpha), cos(alpha), 0,
0, 0, 0, 1);
m_y_axis_rotation_matrix = (cv::Mat_<double>(4, 4) <<
cos(beta), 0, -sin(beta), 0,
0, 1, 0, 0,
sin(beta), 0, cos(beta), 0,
0, 0, 0, 1);
128
m_z_axis_rotation_matrix = (cv::Mat_<double>(4, 4) <<
cos(gamma), -sin(gamma), 0, 0,
sin(gamma), cos(gamma), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1);
// Rotation matrix
(m_x_axis_rotation_matrix*m_y_axis_rotation_matrix*m_z_axis_rotat
ion_matrix)
m_rotation_matrix = m_x_axis_rotation_matrix *
m_y_axis_rotation_matrix * m_z_axis_rotation_matrix;
m_translation_matrix = (cv::Mat_<double>(4, 4) <<
1, 0, 0, dx,
0, 1, 0, dy,
0, 0, 1, dz,
0, 0, 0, 1);
m_3D_to_2D_matrix = (cv::Mat_<double>(3, 4) <<
f, 0, w_init / 2, 0,
0, f, h_init / 2, 0,
0, 0, 1, 0);
m_resulting_transform_matrix = m_3D_to_2D_matrix *
(m_translation_matrix * (m_rotation_matrix * m_2D_to_3D_matrix));
}
// @brief Генерирует и сохраняет проективно искажённые изображения
void ImageRotator::GenerateRotatedImages(const cv::Mat& input_image,
const std::wstring& number_string, const boost::filesystem::path&
output_dir)
{
cv::Mat output_image(cv::Size(650,300), input_image.type(),
cv::Scalar(255., 255., 255., 0));
boost::filesystem::path current_filename = number_string;
std::wstring resulting_filename;
129
for (int alpha = kAlphaMinLimit; alpha <= kAlphaMaxLimit; alpha
+= kAlphaStep)
for (int beta = -kBetaLimit; beta <= kBetaLimit; beta +=
kBetaStep)
for (int gamma = -kGammaLimit; gamma <= kGammaLimit; gamma +=
kGammaStep)
for (int dx = -kDxLimit; dx <= kDxLimit; dx += kDxStep)
{
RotateImage(input_image, output_image, alpha, beta, gamma,
dx, kDy, kDz);
resulting_filename = boost::str(boost::wformat(L"%d %s.jpg")
% m_image_index++ % number_string).c_str();
int bpp = 8 * output_image.elemSize();
// получаем картинку
char* filename = "D:/ResImage/191.jpg";
IplImage* image = cvLoadImage(filename, 1);
// клонируем картинку
IplImage* src = cvCloneImage(image);
printf("[i] image: %s\n", filename);
assert(src != 0);
// окно для отображения картинки
cvNamedWindow("original",CV_WINDOW_AUTOSIZE);
// показываем картинку
cvShowImage("original", image);
system("pause");
SaveImage(output_image, output_dir, resulting_filename);
}
}
130
3. Модуль генерации изображения номерного знака по шаблону со случайным
номером
// @brief Генерирует двумерное изображение номера по шаблону
class NumberGenerator
{
static const int kNumberOfSymbols = 7;
static const int kNumberOfDigits = 10;
// from 0 to 9
public:
NumberGenerator();
// @brief Генерирует шаблоны автомобильных номеров
bool GenerateNextNumber();
// @brief Вычисляет производительность работы
void PrintNumberFrequency() const;
// @brief Возвращает изображение номера по названию
std::shared_ptr<LicensePlate> GetLicensePlateNumber();
// @brief Возвращает имя изображения
const std::wstring& GetNumberString() const;
private:
typedef std::vector<long> LicensePlateTypeVector;
// @brief Генерирует случайные символы номера
void GenerateNumberString();
std::random_device m_random_device;
std::mt19937 m_generator;
std::uniform_int_distribution<> m_distribution;
std::shared_ptr<LicensePlate> m_license_plate;
LicensePlateTypeVector m_license_plate_types;
LicensePlateTypeVector::iterator m_license_plate_type_iterator;
std::array<std::array<int, kNumberOfSymbols>, kNumberOfDigits>
m_frequency_array;
std::wstring m_number_string;
};
131
// @brief Конструктор, инициализирующий список шаблонов генерируемых
изображений автомобильных номеров
NumberGenerator::NumberGenerator() : m_generator(m_random_device()),
m_distribution(0, 9), m_license_plate(nullptr)
{
// В конструкторе генерируются шаблоны израильских номеров
m_license_plate_types = { il_lp::special_yellow_with_IL::value,
il_lp::special_yellow_without_IL::value,
il_lp::special_CC::value,
il_lp::special_CD::value,
il_lp::usual_yellow_with_IL::value,
il_lp::usual_red_with_IL::value,
il_lp::usual_yellow_without_IL::value,
il_lp::usual_CC::value,
il_lp::usual_CD::value,
il_lp::special_yellow_with_IL::value,
il_lp::special_yellow_without_IL::value,
il_lp::special_CC::value,
il_lp::special_CD::value,
il_lp::moto_with_IL::value,
il_lp::moto_without_IL::value};
lp_types->push_back(license_plates::types::UnknownLpType::value);
m_license_plate_type_iterator = m_license_plate_types.begin();
}
// @brief Генерирует шаблоны автомобильных номеров
bool NumberGenerator::GenerateNextNumber()
{
m_license_plate.reset(CreateLicensePlateObject(),
AlgoLibrary::ReleaseDeleter());
GenerateNumberString();
bool res = m_license_plate->Create
(*m_license_plate_type_iterator, GetNumberString().c_str());
++m_license_plate_type_iterator;
if (m_license_plate_type_iterator == m_license_plate_types.end())
132
m_license_plate_type_iterator = m_license_plate_types.begin();
return res;
}
// @brief Вычисляет производительность работы
void NumberGenerator::PrintNumberFrequency() const
{
for (auto& it_row : m_frequency_array)
{
for (auto& it_col : it_row)
{
std::cout << it_col << "
";
}
std::cout << std::endl;
}
}
// @brief Генерирует случайные символы номера
void NumberGenerator::GenerateNumberString()
{
std::wstringstream sstream;
for (int i = 0; i < kNumberOfSymbols; ++i)
{
const int random_digit = m_distribution(m_generator);
m_frequency_array[random_digit][i] ++;
sstream << random_digit;
}
m_number_string = sstream.str();
}
// @brief Возвращает изображение автомобильного номера
std::shared_ptr<LicensePlate> NumberGenerator::GetLicensePlateNumber()
{
return m_license_plate;
}
// @brief Возвращает название сгенерированного изображения
133
const std::wstring& NumberGenerator::GetNumberString() const
{
return m_number_string;
}
// @brief Переворачивает изображение на 90 градусов
cv::Mat CreateFlippedCVMat(std::shared_ptr<LicensePlate>
license_plate_number) {
const BITMAPINFO& bmp_info =
license_plate_number>GetBitmapInfo();
const void* bits = license_plate_number->GetBits();
cv::Mat tmp_image(abs(bmp_info.bmiHeader.biHeight),
bmp_info.bmiHeader.biWidth, CV_8UC(bmp_info.bmiHeader.biBitCount
/ 8), const_cast<void*>(bits), bmp_info.bmiHeader.biSizeImage /
bmp_info.bmiHeader.biHeight);
cv::Mat img_flipped;
cv::flip(tmp_image, img_flipped, 0);
return img_flipped;
}
// @brief Сохраняет изображение в переданную директорию
void SaveImage(cv::Mat outpur_image, const boost::filesystem::path&
output_directory, const std::wstring& filename)
{
if (!boost::filesystem::exists(output_directory))
boost::filesystem::create_directories(output_directory);
const boost::filesystem::path file_path = output_directory /
boost::filesystem::path(filename);
if (!cv::imwrite(file_path.string(), outpur_image))
std::cerr << "File" << file_path.string() << " was failed to
save." << std::endl;
}
4. Пример файла с шаблоном генерируемого ПМ ГИНЗА изображения
Файл IsraelLicensePlates.h
134
#ifndef IsraelLicensePlates_h__
#define IsraelLicensePlates_h__
#include "../Graphics_lib/Graphics_lib.h"
#include "LicensePlatesTools.h"
#include <stdint.h>
#include "LicensePlateBase.h"
namespace license_plates_impl
{
namespace il_lp
{
// @brief Описывает израильские автомобильные номера
class IsraelStringPrinter: public StringPrinter_rle
{
private:
virtual const Cpp_Compressed_Image_Struct*
GetRleImageBySymbol(wchar_t symbol, uint32_t symbol_pos) const;
virtual int16_t GetVerticalShiftForSymbol(wchar_t symbol) const;
};
// Обычный номер (длинный, узкий)
extern const uint16_t USUAL_PLATE_HEIGHT;
extern const uint16_t USUAL_PLATE_WIDTH;
// Координаты голубого знака для обычного номера
extern const LP_POINT USUAL_PLATE_IL_EMBLEM;
class IsraelLicencePlate_usual: private IsraelStringPrinter
{
protected:
IsraelLicencePlate_usual(
const graphics_lib::RGBA_pixel&
pic_color, const graphics_lib::RGBA_pixel& bk_color,
const
LP_RECT& number_area);
virtual ~IsraelLicencePlate_usual();
void GetLpImage(graphics_lib::Image* image, const std::wstring&
number) const;
135
// Координаты области для номера
const LP_RECT NUMBER;
const graphics_lib::RGBA_pixel PIC_COLOR;
const graphics_lib::RGBA_pixel BK_COLOR;
private:
void GetLpImage(graphics_lib::Image* image, const std::wstring&
number) const;
virtual void CreateEmptyFrame(graphics_lib::Image* image) const;
virtual void LayFrameImage
(graphics_lib::Image* image) const;
virtual void AddNumber(graphics_lib::Image* image, const
std::wstring& number) const;
virtual bool NeedInsertDelimiters(const std::wstring& number)
const;
virtual bool NeedLongMinus() const;
void InsertDelimiters(std::wstring* number) const;
virtual wchar_t GetDelimiter() const;
virtual void DoInsertDelimiters(std::wstring* number, wchar_t
delimiter) const;
virtual void AddSomething(graphics_lib::Image* image) const;
virtual void MakeTransparentEdges(graphics_lib::Image* image)
const;
IsraelStringPrinter::virtual const Cpp_Compressed_Image_Struct*
GetRleImageBySymbol(wchar_t symbol, uint32_t symbol_pos) const;
IsraelLicencePlate_usual(const IsraelLicencePlate_usual&);
IsraelLicencePlate_usual& operator=(const IsraelLicencePlate&);
};
// Обычный желтый номер с голубым знаком
// Координаты строки желтого номера с голубым знаком
extern const LP_RECT USUAL_PLATE_YELLOW_WITH_IL_NUMBER;
class IsraelLicencePlate_usual_with_IL_yellow: public
LicensePlateBase, private IsraelLicencePlate_usual
{
136
public:
IsraelLicencePlate_usual_with_IL_yellow();
virtual ~IsraelLicencePlate_usual_with_IL_yellow();
private:
// Формат номера
const std::wstring FORMAT;
// Номер для примера
const std::wstring EXAMPLE_NUMBER;
// Координаты голубого знака для обычного номера
const LP_POINT IL_EMBLEM;
virtual std::wstring DoGetFormat() const;
virtual void DoGetExample(graphics_lib::Image* image) const;
IsraelLicencePlate_usual::virtual void
AddSomething(graphics_lib::Image* image) const;
};
// Обычный красный номер с голубым знаком
// Координаты строки красного номера с голубым знаком
extern const LP_RECT USUAL_PLATE_RED_WITH_IL_NUMBER;
class IsraelLicencePlate_usual_with_IL_red: public LicensePlateBase,
private IsraelLicencePlate_usual
{
public:
IsraelLicencePlate_usual_with_IL_red();
virtual ~IsraelLicencePlate_usual_with_IL_red();
private:
// Формат номера
const std::wstring FORMAT;
// Номер для примера
const std::wstring EXAMPLE_NUMBER;
// Координаты голубого знака для обычного номера
const LP_POINT IL_EMBLEM;
virtual std::wstring DoGetFormat() const;
virtual void DoGetExample(graphics_lib::Image* image) const;
137
IsraelLicencePlate_usual::virtual void
AddSomething(graphics_lib::Image* image) const;
virtual void DoInsertDelimiters(std::wstring* number, wchar_t
delimiter) const;
virtual bool NeedLongMinus() const;
};
// Обычный желтый номер без голубого знака
// Координаты строки желтого номера без голубого знака
extern const LP_RECT USUAL_PLATE_YELLOW_WITHOUT_IL_NUMBER;
class IsraelLicencePlate_usual_without_IL_yellow: public
LicensePlateBase, private IsraelLicencePlate_usual
{
public:
IsraelLicencePlate_usual_without_IL_yellow();
virtual ~IsraelLicencePlate_usual_without_IL_yellow();
private:
// Формат номера
const std::wstring FORMAT;
// Номер для примера
const std::wstring EXAMPLE_NUMBER;
virtual std::wstring
DoGetFormat() const;
virtual void DoGetExample(graphics_lib::Image* image) const;
IsraelLicencePlate_usual::virtual void
AddSomething(graphics_lib::Image* image) const;
virtual bool NeedLongMinus() const;
};
Файл IsraelLicensePlates_constants.cpp
#include "IsraelLicensePlates.h"
namespace license_plates_impl
{
namespace il_lp
{
//Обычный номер (длинный, узкий)
138
const uint16_t USUAL_PLATE_HEIGHT = 460;
const uint16_t USUAL_PLATE_WIDTH
= 2080;
// Координаты строки желтого номера с голубым знаком
const LP_RECT USUAL_PLATE_YELLOW_WITH_IL_NUMBER = {260,
USUAL_PLATE_HEIGHT-82, 2000, USUAL_PLATE_HEIGHT-390};
// Координаты голубого знака для обычного номера
const LP_POINT USUAL_PLATE_IL_EMBLEM = {0, USUAL_PLATE_HEIGHT-1};
// Координаты строки красного номера с голубым знаком
const LP_RECT USUAL_PLATE_RED_WITH_IL_NUMBER = {260,
USUAL_PLATE_HEIGHT-82, 2000, USUAL_PLATE_HEIGHT-390};
// Координаты строки желтого номера без голубого знака
const LP_RECT USUAL_PLATE_YELLOW_WITHOUT_IL_NUMBER = {80,
USUAL_PLATE_HEIGHT-82, 2000, USUAL_PLATE_HEIGHT-390};
// Координаты строки желтого номера без голубого знака с надписью "СС"
в начале. Координаты только области номера, "СС" рисуется отдельно
const LP_RECT USUAL_PLATE_WHITE_CC_NUMBER = {440, USUAL_PLATE_HEIGHT82, 2000, USUAL_PLATE_HEIGHT-390};
// Координаты надписи "СС" для обычного номера
const LP_POINT USUAL_PLATE_WHITE_CC = {80, USUAL_PLATE_HEIGHT-82};
// Координаты строки желтого номера без голубого знака с надписью "CD"
в начале
const LP_RECT USUAL_PLATE_WHITE_CD_NUMBER =
USUAL_PLATE_WHITE_CC_NUMBER;
// Координаты надписи "CD" для обычного номера
const LP_POINT USUAL_PLATE_WHITE_CD = USUAL_PLATE_WHITE_CC;
// Особый номер (длинный, широкий)
const uint16_t SPECIAL_PLATE_HEIGHT = 640;
139
const uint16_t SPECIAL_PLATE_WIDTH = 1260;
// Координаты голубого знака для особого номера
const LP_POINT SPECIAL_PLATE_IL_EMBLEM = {468, SPECIAL_PLATE_HEIGHT473};
// Координаты строки особого желтого номера с голубым знаком
const LP_RECT SPECIAL_PLATE_YELLOW_WITH_IL_NUMBER = {40,
SPECIAL_PLATE_HEIGHT-104, 1220, SPECIAL_PLATE_HEIGHT-384};
// Координаты строки особого желтого номера без голубого знака
const LP_RECT SPECIAL_PLATE_YELLOW_WITHOUT_IL_NUMBER = {40,
SPECIAL_PLATE_HEIGHT-180, 1220, SPECIAL_PLATE_HEIGHT-460};
// Координаты строки особого белого номера с надписью CC
const LP_RECT SPECIAL_PLATE_WHITE_CC_NUMBER = {40,
SPECIAL_PLATE_HEIGHT-180, 1220, SPECIAL_PLATE_HEIGHT-560};
// Координаты надписи "CC" для особого белого номера
const LP_POINT SPECIAL_PLATE_WHITE_CC = {502, SPECIAL_PLATE_HEIGHT54};
// Координаты строки особого белого номера с надписью CD
const LP_RECT SPECIAL_PLATE_WHITE_CD_NUMBER = {40,
SPECIAL_PLATE_HEIGHT-180, 1220, SPECIAL_PLATE_HEIGHT-560};
// Координаты надписи "CD" для особого белого номера
const LP_POINT SPECIAL_PLATE_WHITE_CD = {502, SPECIAL_PLATE_HEIGHT54};
// Квадратный номер
const uint16_t SQUARE_PLATE_HEIGHT = 860;
const uint16_t SQUARE_PLATE_WIDTH
= 900;
// Координаты голубого знака для квадратного номера
const LP_POINT SQUARE_PLATE_IL_EMBLEM = {16, SQUARE_PLATE_HEIGHT-448};
140
// Координаты первой строки квадратного желтого номера с голубым
знаком
extern const LP_RECT SQUARE_PLATE_YELLOW_WITH_IL_NUMBER_1ST_LINE =
{40, SQUARE_PLATE_HEIGHT-104, 860, SQUARE_PLATE_HEIGHT-384};
// Координаты второй строки квадратного желтого номера с голубым
знаком
extern const LP_RECT SQUARE_PLATE_YELLOW_WITH_IL_NUMBER_2ND_LINE =
{310, SQUARE_PLATE_HEIGHT-432, 590, SQUARE_PLATE_HEIGHT-712};
// Координаты первой строки квадратного желтого номера без голубого
знака
extern const LP_RECT SQUARE_PLATE_YELLOW_WITHOUT_IL_NUMBER_1ST_LINE =
SQUARE_PLATE_YELLOW_WITH_IL_NUMBER_1ST_LINE;
// Координаты первой строки квадратного желтого номера без голубого
знака, для случая отсутсвия второй строки
extern const LP_RECT
SQUARE_PLATE_YELLOW_WITHOUT_IL_NUMBER_1ST_LINE_NO_2ND_LINE = {40,
SQUARE_PLATE_HEIGHT-154, 860, SQUARE_PLATE_HEIGHT-434};
} //namespace il_lp
} //namespace license_plates_impl
141
ПРИЛОЖЕНИЕ 4
ПРОГРАММНЫЙ МОДУЛЬ ГЕНЕРАЦИИ ИЗОБРАЖЕНИЙ
НОМЕРНЫХ ЗНАКОВ АВТОМОБИЛЕЙ
ШАБЛОНЫ ИЗОБРАЖЕНИЙ ГЕНЕРИРУЕМЫХ ПМ ГИНЗА
Листов 5
Москва, 2017
142
Шаблоны генерируемых ПМ ГИНЗА изображений номерных пластин, их описание и
индексы представлены в таблице 1.
Таблица 1
Шаблоны изображений генерируемых ПМ ГИНЗА
Индекс в
Страна
Описание
Шаблон
ПМ
ГИНЗА
Транспортные средства, принадлежащие юридическим лицам и гражданам Российской
Федерации, юр. лицам и гражданам иностранных государств, и лицам без гражданства
ru01
РФ
Для легковых, грузовых,
грузопассажирских автомобилей и
автобусов. Трёхзначный код региона.
ru02
РФ
Для легковых, грузовых,
грузопассажирских автомобилей и
автобусов. Двухзначный код региона.
ru03
РФ
Для легковых такси, транспортных
средств, оборудованных для
перевозок более восьми человек.
ru04
РФ
Для автомобильных прицепов и
полуприцепов.
ru05
РФ
Для тракторов, самоходных дорожностроительных и иных машин и
прицепов (полуприцепов) к ним.
ru06
РФ
Для мотоциклов, мотороллеров,
мопедов и снегоходов.
Транспортные средства воинских частей и соединений, находящихся под юрисдикцией
РФ и образованных в соответствии с действующими законодательными актами
ru07
РФ
Для легковых, грузовых,
грузопассажирских автомобилей и
автобусов.
143
ru08
РФ
Для автомобильных прицепов и
полуприцепов.
ru09
РФ
Для тракторов, самоходных дорожностроительных и иных машин и
прицепов (полуприцепов) к ним.
ru10
РФ
Для мотоциклов, мотороллеров,
мопедов и снегоходов.
Транспортные средства, принадлежащие дипломатическим представительствам,
консульским учреждениям, международным (межгосударственным) организациям и их
сотрудникам, аккредитованным при Министерстве иностранных дел РФ
ru11
РФ
Для легковых автомобилей глав
дипломатических представительств.
ru12
РФ
Для легковых, грузовых,
грузопассажирских автомобилей и
автобусов дипломатических
представительств, консульских
учреждений, международных
(межгосударственных) организаций и
их сотрудников, аккредитованных при
Министерстве иностранных дел РФ.
Транспортные средства, временно допущенные к участию в дорожном движении
ru13
РФ
Для легковых, грузовых,
грузопассажирских автомобилей,
автобусов, автомобильных прицепов и
полуприцепов.
ru14
РФ
Для мотоциклов, мотороллеров,
мопедов и снегоходов.
144
ru15
РФ
Для легковых, грузовых,
грузопассажирских автомобилей,
автобусов и прочих транспортных
средств воинских частей и
соединений, находящихся под
юрисдикцией Российской Федерации.
ru16
РФ
Для тракторов, самоходных дорожностроительных и иных машин и
прицепов (полуприцепов) к ним.
ru17
РФ
Для легковых, грузовых,
грузопассажирских автомобилей,
автобусов и прочих транспортных
средств, окончательно выезжающих за
пределы Российской Федерации.
Транспортные средства, принадлежащие органам внутренних дел Российской Федерации
ru18
РФ
Для легковых, грузовых,
грузопассажирских автомобилей,
автобусов.
ru19
РФ
Для автомобильных прицепов и
полуприцепов.
ru20
РФ
Для мотоциклов.
Израильские гражданские регистрационные номерные знаки
is01
Израиль
Номерной знак Израиля нового
образца (европейский стандарт).
is02
Израиль
Номерной знак Израиля старого
образца (европейский стандарт).
is03
Израиль
Номерной знак автомобиля полиции.
is04
Израиль
Номерной знака автомобиля
дипломатического корпуса
(европейский стандарт).
is05
Израиль
Номерной знака автомобиля
консульского корпуса (европейский
стандарт).
145
is06
Израиль
Номерной знак Израиля старого
образца (американский стандарт).
is07
Израиль
Номерной знак Израиля нового
образца (американский стандарт).
is08
Израиль
Номерной знака автомобиля
дипломатического корпуса
(американский стандарт).
is09
Израиль
Номерной знака автомобиля
консульского корпуса (американский
стандарт).
is10
Израиль
Номерной знака для мотоциклов
старого образца.
is11
Израиль
Номерной знака для мотоциклов
нового образца.
Гражданские регистрационные номерные знаки Республики Казахстан нового образца
kz01
Казахстан
Передний и задний номерные знаки
для легковых, грузовых автомобилей
и автобусов юридических лиц;
kz02
Казахстан
Передний и задний номерные знаки
для легковых, грузовых автомобилей
и автобусов физических лиц,
Гражданские регистрационные номерные знаки Республики Казахстан старого образца
kz03
Казахстан
Передний и задний номерные знаки
для легковых, грузовых автомобилей
и автобусов юридических лиц;
kz04
Казахстан
Передний и задний номерные знаки
для легковых, грузовых автомобилей
и автобусов физических лиц,
146
ПРИЛОЖЕНИЕ 5
ПРОГРАММНЫЙ МОДУЛЬ ГЕНЕРАЦИИ ИЗОБРАЖЕНИЙ
НОМЕРНЫХ ЗНАКОВ АВТОМОБИЛЕЙ
КОНФИГУРАЦИОННЫЙ ФАЙЛ С ПАРАМЕТРАМИ ПМ ГИНЗА
Листов 3
Москва, 2017
147
Диапазоны углов поворотов и смещений генерируемых ПМ ГИНЗА приложений
задаются в конфигурационном ini-файле настроек. Ini-файлы — это обычные текстовые
файлы, которые можно редактировать и просматривать при помощи любого текстового
редактора. Ini-файл с настройками ПМ ГИНЗА (default_params.ini) имеет следующий
формат:
[main]
#максимальный угол поворота в градусах вокруг оси X
AlphaMaxLimit=40
#минимальный угол поворота в градусах вокруг оси X
AlphaMinLimit=0
#шаг поворота в градусах вокруг оси X
AlphaStep=10
#смещение вдоль оси X в пикселях
DxLimit=40
#шаг перемещения вдоль оси X в пикселях
DxStep=10
#максимальный угол поворота в градусах вокруг оси Y
BetaMaxLimit=30
#минимальный угол поворота в градусах вокруг оси Y
BetaMinLimit=-30
#шаг поворота в градусах вокруг оси Y
BetaStep=10
#смещение вдоль оси Y в пикселях
DyLimit=20
#шаг перемещения вдоль оси Y в пикселях
DyStep=10
#максимальный угол поворота в градусах вокруг оси Y
GammaLimit=20
#шаг поворота в градусах вокруг оси Y
GammaStep=5
#смещение вдоль оси Y в пикселях
DzLimit=150
#шаг перемещения вдоль оси Y в пикселях
DzStep=190
148
[templates]
#Типы генерируемых изображений номерных знаков
type1 = ru01
type2 = ru02
type3 = ru03
type4 = ru04
type5 = ru05
type6 = ru06
type7 = ru07
type8 = ru08
type9 = ru09
type10 = ru10
type11 = ru11
type12 = ru12
type13 = ru13
type14 = ru14
type15 = ru15
type16 = ru16
type17 = ru17
type18 = ru18
type19 = ru19
type20 = ru20
type21 = is01
type22 = is01
type23 = is02
type24 = is03
type25 = is04
type26 = is05
type27 = is06
type28 = is07
type29 = is08
type30 = is09
type31 = is10
type32 = is11
type33 = kz01..
149
Отзывы:
Авторизуйтесь, чтобы оставить отзыв