Вы находитесь на странице: 1из 73

Министерство образования и науки Российской Федерации

Федеральное государственное автономное образовательное учреждение


высшего образования
"Уральский федеральный университет имени первого президента России Б.Н. Ельцина"
Институт радиоэлектроники и информационных технологий - РТФ
Департамент информационных технологий и автоматики

УДК 004.93 ДОПУСТИТЬ К ЗАЩИТЕ


РОП 09.04.01
_______________ К.А. Аксенов
"____"________________ 2017г.

РАЗРАБОТКА СИСТЕМЫ ВИДЕО-МОНИТОРИНГА


ПАРКОВОЧНОГО ПРОСТРАНСТВА
Магистерская диссертация

Руководитель
доцент, канд. пед. наук Н.В. Папуловская
подпись, дата

Нормоконтролер
доцент, канд. техн. наук Ю.П. Парфёнов
подпись, дата

Выполнил
Студент гр. РИМ-251209 О.В. Соловиченко
подпись, дата

Екатеринбург
2017
РЕФЕРАТ
Тема выпускной квалификационной работы: Разработка системы
видео-мониторинга парковочного пространства
В состав ВКР входят: пояснительная записка 73 с., 20 рисунков, 2
таблицы, 15 источников, 8 приложений.
АВТОМАТИЗИРОВАННАЯ ПАРКОВКА, ВЕБ-ПРИЛОЖЕНИЕ,
АНАЛИЗ ВИДЕО, РАСПОЗНАВАНИЕ АВТОМОБИЛЬНЫХ НОМЕРОВ,
МОНИТОРИНГ ПАРКОВОЧНЫХ МЕСТ.

Объектом исследования является организация пространства на


крупных автомобильных парковках.
Цель выпускной квалификационной работы состоит в решении частной
задачи создания системы видео-мониторинга парковочного пространства для
информационно-управляющей системы «Умная парковка».
Методы проведения работы включают в себя:
– анализ, сравнение, систематизация и обобщение данных о
существующих и разработанных способов автоматизации работы
парковочных комплексов;
– анализ алгоритмов и подходов, позволяющих проводить видеоанализ;
– эксперименты по распознаванию тестовых примеров;
– апробация алгоритмов распознавания на макете парковки;
Результаты работы и их новизна: изучены варианты использования
технологий видеоанализа в контексте парковки. Рассмотрены основные
этапы распознавания регистрационных номеров и способы мониторинга
парковочных мест. Разработан макет парковки демонстрирующий работу
системы. Результаты, полученные в ходе расчетов и моделирования, имеют
большую практическую значимость.
Основные конструктивные, технологические и технико-
эксплуатационные характеристики: система видео мониторинга
парковочного пространства включает в себя два модуля. Модуль
2
распознавания номеров для идентификации приезжающих автомобилей.
Модуль распознавания графических меток для мониторинга парковочных
мест. Система разработана на платформе .Net Framework с использованием
библиотеки анализа изображений EmguCV.
Степень внедрения: система внедрена на макете парковки.
Рекомендации по внедрению или итоги внедрения результатов НИР:
разработанная система может быть использована в крупных парковках для
поддержания актуальности состояния базы данных парковочных мест и
идентификации приехавших клиентов.
Область применения: крупные автомобильные парковки.
Теоретическая и практическая значимость работы состоит в
исследовании в области развития современных информационных технологий
и технологий видеоанализа, применения информационных технологий и
технологий видеоанализа для улучшения качества жизни и комфорта как
жителей России в целом, так и водителей в частности.
Прогнозные предположения о развитии объекта исследования:
информационно-управляющая система «Умная парковка» позволит
автомобилю самостоятельно парковаться на забронированное место.
В работе актуализируется проблема поиска свободного парковочного
места на крупных парковках. Предлагаемый вариант решения позволяет
ускорить поиск водителем свободного места. Разработанная система видео-
мониторинга парковочного пространства, являющаяся частью программного
комплекса «Умная парковка», включает в себя два модуля. Модуль
распознавания номеров для идентификации приезжающих автомобилей.
Модуль распознавания графических меток для мониторинга парковочных
мест. Работы по тестированию проводилась на макете автомобильной
парковки с использованием радиоуправляемых моделей.
Результаты экспериментальных исследований, проведенных на макете,
позволяют сделать вывод о стабильности работы программного обеспечения,
и о пригодности ее внедрения на реальном объекте.

3
СОДЕРЖАНИЕ
РЕФЕРАТ ........................................................................................................... 2

НОРМАТИВНЫЕ ССЫЛКИ ........................................................................... 6

ОПРЕДЕЛЕНИЯ................................................................................................ 7

ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ .............................................................. 8

ВВЕДЕНИЕ........................................................................................................ 9

1 Обзор существующих аналогов.................................................................. 13

1.1 Parkeon ................................................................................................ 13

1.2 Микком AS101 ProPark .................................................................... 14

1.3 Аксиома Групп «Умная парковка» ................................................. 16

2 Настройка видеопотока с камеры Cisco .................................................... 17

3 Структура регистрационного знака ........................................................... 20

4 Компьютерное зрение .................................................................................. 21

5 Анализ подходов к распознаванию номеров ............................................ 28

6 Технология распознавания автомобильных номеров .............................. 29

6.1 Поиска номера ................................................................................... 29

6.2 Нормализация изображения с номером .......................................... 31

6.3 Алгоритмы распознавания символов .............................................. 32

6.4 Проверка номера ............................................................................... 33

7 Анализ технологий мониторинга парковочных мест............................... 34

8 Оптическое распознавание меток .............................................................. 36

9 Обзор использованного программного обеспечения ............................... 38

9.1 Среда разработки .............................................................................. 38

9.2 Платформа .NET Framework ............................................................ 39

9.3 Язык программирования .................................................................. 44

4
9.4 Используемые библиотеки ............................................................... 45

10 Программная реализация .......................................................................... 48

10.1 Программа распознавания автомобильных номеров .................. 48

10.2 Программа распознавания свободных мест ................................. 50

ЗАКЛЮЧЕНИЕ ............................................................................................... 53

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ..................................... 54

ПРИЛОЖЕНИЕ А ........................................................................................... 56

ПРИЛОЖЕНИЕ Б............................................................................................ 59

ПРИЛОЖЕНИЕ В ........................................................................................... 63

ПРИЛОЖЕНИЕ Г............................................................................................ 66

ПРИЛОЖЕНИЕ Д ........................................................................................... 67

ПРИЛОЖЕНИЕ Е ........................................................................................... 68

ПРИЛОЖЕНИЕ Ж .......................................................................................... 70

ПРИЛОЖЕНИЕ И ........................................................................................... 73

5
НОРМАТИВНЫЕ ССЫЛКИ

СТП УГТУ-УПИ 1-96 Стандарт предприятия. Общие требования и


правила оформления дипломных и курсовых
проектов (работ).
ГОСТ 7.0.5-2008 Система стандартов по информации,
библиотечному и издательскому делу.
Библиографическая ссылка.
ГОСТ 7.1-2003 Библиографическая запись. Библиографическое
описание.
ГОСТ 7.9-95 Система стандартов по информации,
библиотечному и издательскому делу. Реферат и
аннотация.
ГОСТ 7.32-2001 Система стандартов по информации,
библиотечному и издательскому делу. Отчет о
научно-исследовательской работе. Структура и
правила оформления.
ГОСТ 34.602-89 Комплекс стандартов на автоматизированные
системы. Техническое задание на создание
автоматизированной системы.
ГОСТ Р 50577-93 Знаки государственные регистрационные
транспортных средств. Типы и основные размеры.
Технические требования

6
ОПРЕДЕЛЕНИЯ
В настоящей пояснительной записке применяют следующие термины с
соответствующими определениями:

База данных Поименованная совокупность взаимосвязанных данных,


относящихся к определенной предметной области.
OpenCV Open Source Computer Vision – библиотека функций,
главным образом нацеленных на реализацию машинного
зрения в реальном времени. Кроссплатформенная, имеет
лицензию BSD.
OCR Оптическое распознавание символов (optical character
recognition) — механический или электронный перевод
изображений рукописного, машинописного или печатного
текста в текстовые данные, использующихся для
представления символов в компьютере.
EmguCV Emgu CV является кроссплатформенным .Net
дополнением для библиотеки OpenCV для обработки
изображений. Разработано для работы с .NET
совместимыми языками, такими как C #, VB, VC ++,
IronPython и т.д., может быть использовано в Visual
Studio, Xamarin, работает с Windows, Linux, Mac OS X,
IOS, Android и Windows Phone.

7
ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ
В пояснительной записке используются следующие обозначения и
сокращения:
ИУС Информационно-управляющая система
СУБД Система управления базами данных
БД База данных
ПО Программное обеспечение
ID Идентификатор
ANPR Automatic number plate recognition, автоматическое
распознавание номерного знака
IDE Integrated development environment, интегрированная
среда разработки

8
ВВЕДЕНИЕ
Актуальность темы исследования. В крупных городах у
автомобилистов часто возникает проблема парковки транспортного средства.
На то чтобы найти свободное место на обычной парковке может уйти
довольно много времени. Например, в Германии поиск подходящего
парковочного места в среднем занимает около 10 минут. Согласно
исследованию, которое проводились компанией-лидером европейского
рынка по управлению парковками, водителям приходится проезжать до 4,5
км в поисках места, где можно припарковаться [1]. Получается, что водитель
теряет не только время, но и деньги на топливо. Проект «Умная парковка»
создается специально для того чтобы решить эти проблемы. Таким образом
«Умная парковка» позволит водителям забронировать себе место на
парковке, а также покажет маршрут до него.
Чтобы отслеживать приехавших клиентов, необходимо программное
обеспечение для распознавания автомобильных номеров. Распознавание
номеров можно проводить в облачном сервисе (например, Google Vision)
либо на локальном сервере. У этих двух подходов есть свои преимущества и
недостатки. Для определения состояния места (свободно или занято) можно
использовать уникальные графические метки и использовать ПО
видеоанализа для их распознавания, либо можно применить ультразвуковые
датчики. Если на парковке установлены камеры для видеонаблюдения, то
можно использовать их для распознавания состояния мест, затраты будут
только на то, чтобы нанести маркеры на места. Но это решение не подойдет
для открытой парковки, так как снег перекроет метки. Датчики в этом
отношении будут надежнее, но их сложнее установить и необходимо
заботиться о работоспособности.
Анализ актуальности обусловили выбор темы исследования:
«Разработка системы видеомониторинга парковочного пространства».
Гипотеза исследования: Система видеомониторинга парковочного
пространства позволит анализировать состояние парковочных мест в режиме

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

10
– документация к различным используемым библиотекам
видеоанализа;
Теоретическая и практическая значимость работы. Работа
открывает направление исследований в области развития современных
информационных технологий и технологий видеоанализа, применения
информационных технологий и технологий видеоанализа для улучшения
качества жизни и комфорта как жителей России в целом, так и водителей в
частности.
Выявлены, обоснованы и описаны преимущества информационных
технологий как инструмента развития парковочных систем. Показано, что с
помощью этого инструмента становится возможным повысить
эффективность и удобство как крытых, так и открытых парковок, не
потратив на это большое количество ресурсов.
Исследование показывает, что внедрение информационной системы
«умной парковки» в традиционную систему парковок, включая охраняемые и
неохраняемые парковки, не нарушает ее целостности, раскрывая при этом ее
потенциал в решении проблем с очередями, переполненностью и
безопасностью; а также в повышении удовлетворенности пользователей
парковок – водителей.
На защиту выносятся:
1. Система видео-мониторинга парковочного пространства;
2. Макет парковки демонстрирующий работу системы;

В рамках выпускной квалификационной работы разработан набор


программных модулей для информационно-управляющей системы «Умная
парковка», который прошел апробацию на макете.

11
Основные идеи исследования были представлены на 3 научных
международных конференциях, проходивших в Екатеринбурге:
«Информационные технологии, телекоммуникации и системы управления»
(2015 г.), «Компьютерный анализ изображений: Интеллектуальные решения
для промышленных сетей» (ICCAI’16) (2016 г.), Форум молодых ученых
«ИТ: глобальные вызовы и новые решения» (2016 г.).
Тема выпускной квалификационной работы: Разработка системы
видео-мониторинга парковочного пространства
В состав ВКР входят: пояснительная записка 73 с., 20 рисунков, 2
таблицы, 15 источников, 8 приложений.

12
1 Обзор существующих аналогов
1.1 Parkeon
Parkeon присутствует в более чем 4000 городах и мегаполисах в 60
странах мира, предлагая инновационные интеллектуальные транспортные
решения и парковочные решения [2].
Последовательность действий в соответствии с рисунком 1:
1 въезд:
- Машина останавливается напротив въезда, прямо перед
шлагбаумом;
- Сенсор распознает присутствие машин, а соответствующая
камера автоматически распознаёт и записывает номер машины,
дату и время въезда;
- Удаленная система управления получает данные,
предоставленные этой камерой и добавляет их в базу данных.
Если клиент уже зарегистрирован, то добавляется также
информация о членстве и дата резервирования;
- Шлагбаум на въезде поднимается, позволяя водителю попасть на
парковку. Шлагбаум автоматически опускается, когда машина
проходит через сенсор безопасности;
2 выезд:
- Машина останавливается на выезде, прямо перед шлагбаумом;
- Сенсор распознает присутствие машины, а камера проверяет гос.
номер на соответствие информации о платеже, или набору машин
в базе данных;
- Система управления валидирует корректный платеж, или
разрешение на парковку без платежа, чтобы разрешить выезд;
- Шлагбаум на выезде поднимаемся, позволяя водителю покинуть
парковку;
- Шлагбаум автоматически опускается, как только машина
проезжает через сенсор безопасности;

13
Рисунок 1 - Принцип работы Parkeon

1.2 Микком AS101 ProPark


Принцип работы заключается в точном определении расположения
свободных и занятых мест и/или в подсчете количества въехавших и
выехавших машин. Световая индикация каждого парковочного места и
информационные табло указывают водителю свободные места и
оптимальный маршрут к ним в соответствии с рисунком 2. Система
обеспечивает оперативный и постоянный контроль загруженности с
предоставлением персоналу всей необходимой информации, управление
светофорами, табло и шлагбаумами [3].

14
Рисунок 2 - Пример реализации Микком AS101 ProPark

Система выполнена на базе комплекса безопасности AS101 Pro и


обладает присущей комплексу высокой надежностью, удобством и простотой
эксплуатации.
В рамках данного проекта был создан ряд новых устройств
(ультразвуковые датчики присутствия автомобиля в соответствии с рисунком
3, выносные индикаторы занятости места, информационные табло, датчики
въезда/выезда, счетчики-сумматоры проехавших автомобилей) и ПО.

Рисунок 3 - Схематичное изображение Микком AS101 ProPark

15
1.3 Аксиома Групп «Умная парковка»
Основной задачей проекта является внедрение программно-
аппаратного комплекса, позволяющего в режиме реального времени
отслеживать состояние каждого парковочного места. Решение основано на
технологии компании Nedap AVI, которая, в свою очередь, разработала
решение SENSIT. Суть решения состоит во внедрении в каждое парковочное
место датчика, который с помощью электромагнитного и инфракрасного
сенсоров определяет наличие или отсутствие транспортного средства. Далее
по радиоканалу датчики передают информацию на базовые станции, которые
аккумулируют информацию по группе мест и передают ее на управляющий
сервер.
Разработанное компанией Аксиома Групп программное обеспечение
позволяет систематизировать полученную информацию с датчиков, строить
аналитическую отчетность по занятости, оборачиваемости парковочных
мест, передавать информацию в навигационные системы, а также на
светодиодные табло, расположенные в городе. Все оборудование, которое
используется в уличных условиях, обладает сертификацией не ниже IP65 и
полностью адаптировано под климатические условия г. Москва. Работа по
проекту велась в тесной связке со службами города, включая Департамент
Капитального Ремонта, ГКУ Администратор Московского Парковочного
Пространства. Система введена в эксплуатацию и уже сегодня позволяет
автолюбителям и службам города получать информацию по загруженности
парковочных мест на улицах города в пределах Бульварного кольца [4].

16
2 Настройка видеопотока с камеры Cisco
Настройка камеры CISCO началась с изучения руководства по
установке.
IP-камера Cisco Video Surveillance 6000P обеспечивает разрешение
высокой четкости 1080p с превосходным качеством изображения. Камера
может давать более качественное изображение, чем стандартная VGA-
камера, значительно уменьшая количество необходимых камер. Она
особенно подходит для контроля широких открытых пространств, таких как
подъезды, аэропорты или области, требующие точной идентификации. IP-
камера 6000P поддерживает множество передовых функций и позволяет
просматривать видео высокой четкости. Благодаря высокоскоростной
технологии сжатия H.264//MJPEG камера обеспечивает высококачественное
видео в Full HD при 30 кадрах в секунду с минимумом потребления полосы
пропускания. IP-камера 6000P оборудована мощным объективом с
технологией P-Iris,, которая точно контролирует ширину открытия
диафрагмы, обеспечивая превосходную четкость и максимальную глубину
изображения. IP-камера 6000P снабжена съемным ИК-фильтром,
обеспечивающим четкие изображения 24 часа в сутки. Также обладая
множеством других функций высокого уровня, таких как разъем для карты
SD/SDHC, PoE и несколько потоков, IP-камера 6000P изображенная на
рисунке 4 является, бесспорно, лучшим выбором для надежного и
высокоэффективного мегапиксельного видеонаблюдения.

Рисунок 4 - IP камера CISCO

17
Процедура установки IP камеры CISCO:
- Вставьте объектив в отверстие для объектива и проверните по часовой
стрелке до упора. При необходимости медленно поворачивайте его
против часовой стрелки до тех пор, пока не будет получен наилучший
угол обзора. IP-камера совместима с объективами, снабженными
креплением CS при выступании объектива до 5 мм;
- Подключите кабель объектива P-iris к разъему объектива P-iris на
задней панели IP-камеры;
- Подключите STP-кабель (экранированная витая пара) категории 5 или
выше к порту локальной сети на задней панели камеры и к
маршрутизатору или коммутатору с портом 10/100/BaseT;
- Подключите адаптер питания на 12 В пост. тока в разъем питания
камеры;
- Дождитесь загрузки камеры и проверьте индикаторы. • Красный
индикатор (состояние) должен гореть непрерывно. • Зеленый
индикатор (сеть) должен периодически мигать;
- Закрепите IP-камеру в желаемом положении. Подсоедините крепеж к
монтажному резьбовому отверстию снизу или сверху камеры в
зависимости от условий установки;
Процедура настройки IP камеры CISCO:
- Запустите браузер, введите в адресной строке HTTPS://ip_адрес;
- Введите данные для входа по умолчанию;
- В строке admin введите в поля «Пароль» и «Подтверждение пароля»
новый пароль администратора камеры;
- В строке root введите в поля «Пароль» и «Подтверждение пароля»
пароль для подключения к IP-камере по SSH;
- Если вы хотите разрешить подключение к камере по протоколам
HTTP и HTTPS, в области «Протоколы доступа» установите флажок
Включить HTTP;

18
- Нажмите кнопку Применить. IP-камера перезагрузится, и будет
открыто окно входа;
Войдя в систему IP-камеры, вы получаете доступ к ее окнам и можете
выполнять различные административные и пользовательские операции.
Набор ссылок и действий, доступных в окнах системы IP-камеры,
зависит от вашего уровня привилегий:
- Администратор — имеет доступ ко всем окнам, возможностям и
функциям IP-камеры;
- Наблюдатель — имеет ограниченный доступ к окну «Видео и
управление камерой», а также доступ к ссылкам Обновить,
Выход, О системе и Справка в этом окне [5];

19
3 Структура регистрационного знака
Автомобильный номер — индивидуальный регистрационный знак
(номер) автомобиля. Он обычно изображается на световозвращающем листе
металла или пластмассы (номерной знак) на передней и задней сторонах
машины, или на бумажной основе и размещается под передним (ветровым)
или задним стеклом транспортного средства.
Часто автомобильный номер указывает на административную единицу
государства, в которой зарегистрировано транспортное средство.
Из-за того, что в автомобильных кодах использовались только буквы,
сходные по начертанию с латинским алфавитом (всего двенадцать букв — А,
В, Е, К, М, Н, О, Р, С, Т, У, Х), в регионах с самой большой численностью
населения и темпами автомобилизации все возможные сочетания номеров
были быстро исчерпаны; в этой связи в регионах с большим количеством
автомобилей стали выпускать номера с единицей, а позднее и с семеркой,
добавленной к коду региона
Согласно ГОСТ Р 50577-93 и в соответствии с рисунком 5, структура
государственного регистрационного знака следующая: М 000 ММ 55 или М
000 ММ 555, где 0 и М соответственно цифра и буква, означающие номер и
серию регистрационного знака транспортного средства.

Рисунок 5 - Структура регистрационного знака

20
4 Компьютерное зрение
Возможность видеть и распознавать объекты – естественная и
привычная возможность для человека. Однако для компьютера пока что – это
чрезвычайно сложная задача. Сейчас предпринимаются попытки научить
компьютер хотя бы толике того, что человек использует каждый день, даже
не замечая того.
Наверное, чаще всего обычный человек встречается с компьютерным
зрением на кассе в супермаркете. Конечно, речь идет о считывании штрих
кодов. Они были разработаны специально именно таким образом, чтобы
максимально упростить компьютеру процесс считывания. Но есть и более
сложные задачи: считывание номеров автомобилей, анализ медицинских
снимков, дефектоскопия на производстве, распознавание лиц и т.д. Активно
развивается применение компьютерного зрения для создания систем
дополненной реальности.
Разница между зрением человека и компьютера
Ребенок учится распознавать объекты постепенно. Он начинает
осознавать, как меняется форма объекта в зависимости от его положения и
освещения. В дальнейшем при распознавании объектов человек
ориентируется на предыдущий опыт. За свою жизнь человек накапливает
огромное количество информации, процесс обучения нейронной сети не
останавливается ни на секунду. Для человека не представляет особой
сложности по плоской картинке восстановить перспективу и представить
себе, как бы все это выглядело в трех измерениях.
Компьютеру все это дается гораздо сложнее. И в первую очередь из-за
проблемы накопления опыта. Нужно собрать огромное количество примеров,
что пока что не очень получается.
Кроме того, человек при распознавании объекта всегда учитывает
окружение. Если выдернуть объект из привычного окружения, узнать его
станет заметно труднее. Тут тоже играет роль накопленный за жизнь опыт,
которого у компьютера нет.

21
Представим, что нам нужно научиться с одного взгляда определять пол
человека (одетого) по фотографии. Для начала нужно определить факторы,
которые могут указывать на принадлежность к тому или иному объекту.
Кроме того, нужно собрать обучающее множество. Желательно, чтобы оно
было репрезентативным. В нашем случае возьмем в качестве обучающей
выборки всех присутствующих в аудитории. И попробуем на их основе найти
отличительные факторы: например, длина волос, наличие бороды, макияжа и
одежда (юбка или брюки). Зная, у какого процента представителей одного
пола встречались те или иные факторы, мы сможем создать достаточно
четкие правила: наличие тех или иных комбинаций факторов с некоей
вероятностью позволит нам сказать, человек какого пола на фотографии.
Машинное обучение
Конечно, это очень простой и условный пример с небольшим
количеством верхне-уровневых факторов. В реальных задачах, которые
ставятся перед системами компьютерного зрения, факторов гораздо больше.
Определять их вручную и просчитывать зависимости – непосильная для
человека задача. Поэтому в таких случаях без машинного обучения не
обойтись никак. Например, можно определить несколько десятков
первоначальных факторов, а также задать положительные и отрицательные
примеры. А уже зависимости между этими факторами подбираются
автоматически, составляется формула, которая позволяет принимать
решения. Достаточно часто и сами факторы выделяются автоматически.
Изображение в цифрах
Чаще всего для хранения цифровых изображений используется
цветовое пространство RGB. В нем каждой из трех осей (каналов)
присваивается свой цвет: красный, зеленый и синий. На каждый канал
выделяется по 8 бит информации, соответственно, интенсивность цвета на
каждой оси может принимать значения в диапазоне от 0 до 255. Все цвета в
цифровом пространстве RGB получаются путем смешивания трех основных
цветов.

22
К сожалению, RGB не всегда хорошо подходит для анализа
информации. Эксперименты показывают, что геометрическая близость
цветов достаточно далека от того, как человек воспринимает близость тех
или иных цветов друг к другу.
Но существуют и другие цветовые пространства. Весьма интересно в
нашем контексте пространство HSV (Hue, Saturation, Value). В нем
присутствует ось Value, обозначающая количество света. На него выделен
отдельный канал, в отличие от RGB, где это значение нужно вычислять
каждый раз. Фактически, это черно-белая версия изображения, с которой уже
можно работать. Hue представляется в виде угла и отвечает за основной тон.
От значения Saturation (расстояние от центра к краю) зависит насыщенность
цвета.
HSV гораздо ближе к тому, как мы представляем себе цвета. Если
показать человеку в темноте красный и зеленый объект, он не сможет
различить цвета. В HSV происходит то же самое. Чем ниже по оси V мы
продвигаемся, тем меньше становится разница между оттенками, так как
снижается диапазон значений насыщенности. На схеме это выглядит как
конус, на вершине которого предельно черная точка.
Локальные и глобальные признаки
Признаки, при помощи которых человек анализирует изображение,
бывают локальными и глобальными. В соответствии с рисунком 6
большинство людей скажет, что на ней изображена красная машина.

23
Рисунок 6 - Исходное изображение

Детектирование и сегментация
В компьютерном зрении этот процесс называется детектированием и
сегментацией. Сегментация – это разделение изображения на множество
частей, связанных друг с другом визуально, либо семантически. А
детектирование – это обнаружение объектов на изображении.
Детектирование нужно четко отличать от распознавания. Допустим, на той
же картинке в соответствии с рисунком 7 можно детектировать автомобиль и
дорожный знак. Но распознать знак его невозможно, так как он повернут к
нам обратной стороной. Так же при распознавании лиц детектор может
определить расположение лица, а «распознаватель» уже скажет, чье это лицо.

24
Рисунок 7 - Детектирование и сегментация

Дескрипторы и визуальные слова


Существует много разных подходов к распознаванию.
Например, такой: на изображении сначала нужно выделить интересные
точки или интересные места. Что-то отличное от фона: яркие пятна,
переходы и т.д. Есть несколько алгоритмов, позволяющих это сделать.
Один из наиболее распространенных методов обработки изображений
– Difference of Gaussians (DoG). Размывая картинку с разным радиусом и
сравнивая получившиеся результаты, можно находить наиболее контрастные
фрагменты. Области вокруг этих фрагментов представляют интерес.
Далее эти области описываются в цифровом виде. Области
разбиваются на небольшие участки, определяется, в какую сторону
направлены градиенты, получаются векторы в соответствии с рисунком 8.
Полученные данные записываются в дескрипторы.

25
Рисунок 8 - Метод Difference of Gaussians

Чтобы одинаковые дескрипторы признавались таковыми независимо от


поворотов в плоскости, они разворачиваются так, чтобы самые большие
векторы были повернуты в одну сторону. Делается это далеко не всегда. Но
если нужно обнаружить два одинаковых объекта, расположенных в разных
плоскостях.
Дескрипторы можно записывать в числовом виде. Дескриптор можно
представить в виде точки в многомерном массиве. В двумерный массив в
соответствии с рисунком 8 попали наши дескрипторы. После этого возможно
их кластеризовать – разбить на группы.
Дальше для каждого кластера описывается область в пространстве.
Когда дескриптор попадает в эту область, для нас становится важным не то,
каким он был, а то, в какую из областей он попал. На следующем шаге
сравниваются изображения, чтобы определить, сколько дескрипторов одного
изображения оказались в тех же кластерах, что и дескрипторы другого
изображения. Такие кластеры можно называть визуальными словами.
Чтобы находить не просто одинаковые картинки, а изображения
похожих объектов, требуется взять множество изображений этого объекта и
множество картинок, на которых его нет. Затем выделить из них
дескрипторы и кластеризовать их. Далее нужно выяснить, в какие кластеры
попали дескрипторы с изображений, на которых присутствовал нужный нам

26
объект. Если дескрипторы с нового изображения попадают в те же кластеры,
значит, на нем присутствует искомый объект.
Совпадение дескрипторов – еще не гарантия идентичности
содержащих их объектов. Один из способов дополнительной проверки –
геометрическая валидация. В этом случае проводится сравнение
расположения дескрипторов относительно друг друга.
Распознавание и классификация
Для простоты представим, что все изображения делятся на три класса:
архитектура, природа и портрет. В свою очередь, природа подразделяется на
растения животных и птиц. А уже поняв, что это птица, можно определить,
какая именно: сова, чайка или ворона.
Разница между распознаванием и классификацией достаточно условна.
Если на картинке нашлась сову, то это скорее распознавание. Если просто
птицу, то это некий промежуточный вариант. А если только природу – это
определенно классификация. Т.е. разница между распознаванием и
классификацией заключается в том, насколько глубоко прошлись по
иерархии. И чем дальше будет продвигаться компьютерное зрение, тем ниже
будет сползать граница между классификацией и распознаванием [6].

27
5 Анализ подходов к распознаванию номеров
Можно выделить два подхода в распознавании автомобильных
номеров. Распознавание можно проводить в облачном сервисе либо
использовать для этого библиотеки распознавания. У этих подходов есть
свои преимущества и недостатки.
Распознавание регистрационных номеров на локальном сервере
требует серьезных вычислительных затрат, разработку и сопровождение ПО.
Зато существуют бесплатные библиотеки с помощью которых можно
разработать ПО распознавания автомобильных номеров.
Распознавание регистрационных номеров в облачном сервисе экономит
вычислительные ресурсы, кроме того ПО распознавания уже готово и его
сопровождением занимается сторонняя компания. Но за услуги облачного
распознавания придется платить, так же необходимо постоянное
широкополосное подключение к интернету. Для сравнения подходов были
выявлены критерии. В таблице 1 приведено сравнение этих подходов.
Таблица 1 – Сравнение подходов к распознаванию номеров
Критерий Распознавание на Распознавание в облачном
локальном сервере сервисе
Потребление Высокое Низкое
вычислительных
ресурсов
Наличие сети Не нужен Нужен
Интернет
Стоимость open-source Плата за каждое распознавание
ПО распознавания Необходимо Разработкой и сопровождением
разрабатывать и занимается сторонняя
отлаживать организация
Взвесив достоинства и недостатки этих подходов было решено
использовать локальные библиотеки распознавания, т.к. ключевым
параметром является цена.

28
6 Технология распознавания автомобильных номеров
Один из ключевых параметров для создания системы распознавания —
используемая аппаратура для фотосъёмки. Чем мощнее и лучше система
освещения, чем лучше камера, тем больше шансов распознать номер.
Хороший инфракрасный (ИК) прожектор может просветить даже пыль и
грязь, имеющиеся на номере, затмить все мешающие факторы. Чем лучше
система съёмки — тем надежнее результат. Лучший алгоритм без хорошей
системы съёмки бесполезен [7].

Основные этапы алгоритма:


- Поиск номера;
- Нормализация номера;
- Выделение каждого символа номерного знака;
- Распознавание символов;
- Проверка номера;

6.1 Поиска номера


Анализ границ и фигур, контурный анализ
Самый очевидный способ выделения номера – поиск прямоугольного
контура. Работает только в ситуациях, когда есть ясно читаемый контур,
ничем не загороженный, с достаточно высоким разрешением и с ровной
границей. Производится фильтрация изображения для нахождения границ,
после чего производится выделение всех найденных контуров в соответствии
с рисунком 9 и их анализ.

29
Рисунок 9 - Выделение контуров изображения

Анализ только части границ


Выделяются контуры, после чего ищутся все вертикальные прямые.
Для любых двух прямых, расположенных недалеко друг от друга, с
небольшим сдвигом по оси y, с правильным отношением расстояния между
ними к их длине, рассматривается гипотеза того, что номер располагается
между ними.
Гистограммный анализ регионов
Одним из самых популярных методов подхода является анализ
гистограмм изображения в соответствии с рисунком 10. Подход
основывается на предположении, что частотная характеристика региона с
номером отлична от частотной характеристики окрестности.

Рисунок 10 - Анализ гистограмм изображения

30
На изображении выделяются границы (выделение высокочастотных
пространственных компонент изображения). Строится проекция
изображения на ось y (иногда и на ось x). Максимум полученной проекции
может совпасть с расположением номера.
У такого подхода есть существенный минус – машина по размеру
должна быть сопоставима с размером кадра, т. к. фон может содержать
надписи или другие детализированные объекты.

6.2 Нормализация изображения с номером


Для лучшего распознавания необходимо улучшить качество
изображения. Сделать это можно при мощи бинаризации изображения.
Процесс бинаризации – это перевод цветного (или в градациях серого)
изображения в двухцветное черно-белое. Главным параметром такого
преобразования является порог t – значение, с которым сравнивается яркость
каждого пикселя.
Главная цель бинаризации, это радикальное уменьшение количества
информации, с которой приходится работать. Удачная бинаризация сильно
упрощает последующую работу с изображением. С другой стороны, неудачи
в процессе бинаризации могут привести к искажениям, таким, как разрывы в
линиях, потеря значащих деталей, нарушение целостности объектов,
появление шума и непредсказуемое искажение символов из-за
неоднородностей фона. По результатам сравнения, пикселю присваивается
значение 0 или 1.

5.3 Выделение каждого символа номерного знака


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

31
оставить контур большего размера. В соответствии с рисунком 11, в контуре
«6» находится конур «о». Контур характеризуется четырьмя точками.

Y X1, Y1 X2, Y2

x1, y1 x2, y2

x3, y3 x4, y4

X3, Y3 X4, Y4 X

Рисунок 11 - Координаты контуров

Для исключения контура нужно чтобы выполнялись следующие


условия:
x1>X1 и y1<Y1 и x2<X2 и y2<Y2 и x3>X3 и y3>Y3 и x4<X4 и y4>Y4
Таким образом, сравнив каждый контур с каждым и исключая лишние,
получим нужные контуры в соответствии с рисунком 12.

Рисунок 12 - Результат бинаризации изображения и выделения символов

6.3 Алгоритмы распознавания символов


Задача распознавания текста или отдельных символов (optical character
recognition, OCR) с одной стороны сложная, а с другой — вполне
классическая. Существует множество алгоритмов её решения, некоторые из
которых достигли совершенства. Но, с другой стороны, самых лучших
алгоритмов в открытом доступе нет. Есть, конечно Tesseract OCR и
несколько его аналогов, но эти алгоритмы не решают всех задач. В целом,
32
методы распознавания текста можно разбить на два класса: структурные
методы, основанные на морфологии и анализе контура, имеющие дело с
бинаризованным изображением, и растровые методы, основанные на анализе
непосредственного изображения. При этом зачастую используется
комбинация структурных и растровых методов
Отдельные символы, полученные на предыдущем шаге передаются в
библиотеку распознавания.

6.4 Проверка номера


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

33
7 Анализ технологий мониторинга парковочных мест
Для определения состояния парковочных мест можно использовать:
- Оптическое распознавание маркеров;
- Ультразвуковые датчики;
Оптическое распознавание маркеров
Каждое парковочное место в соответствии с рисунком 14 отмечено
специальным знаком-маркером. Если автомобиль занимает парковочное
место, то он полностью закрывает специальный знак и можно считать это
место занятым.
Для данного подхода необходимо чтобы все парковочные места были
под видеонаблюдением. Если камер на парковке достаточно, то технология
оптического распознавания не потребует установки дополнительного
оборудования. Данный подход не подойдет для открытых парковок, так как
снег и лужи могут перекрыть графические метки.

Рисунок 13 - Пример табло и парковочных мест в разрабатываемой системе

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

34
В таблице 2 приведено сравнение технологий оптического
распознавания и ультразвуковых датчиков применительно к парковке.

Таблица 2 – Сравнение подходов мониторинга парковочных мест


Оптическое Ультразвуковые
распознавание датчики
Использование на Не рекомендуется Рекомендуется
открытой парковке
Электропитание Работа от сети Работа от батареек
Затраты на Нет, если камеры Требуется датчик на
оборудование охватывают все места каждое место

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

35
8 Оптическое распознавание меток
Метка Aruca представляет собой синтетический квадратный маркер
состоящий из широкой черной рамки и внутренней двоичной матрицы в
соответствии с рисунком 13, которая определяет его идентификатор (ID).
Черная облегчает ее быстрое обнаружение в изображении, а двоичная
кодификация позволяет его идентифицировать и применять методы
обнаружения и коррекции ошибок. Размер маркера определяется размером
внутренней матрицы. Например, размер маркера 4x4 состоит из 16 бит.

Рисунок 14 - Aruco маркеры

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

36
Модуль aruco включает в себя некоторые предопределенные словари,
охватывающие диапазон маркеров различных размеров.
Учитывая изображение, на котором видно некоторые маркеры ArUco, в
результате процесс обнаружения должен вернуть список обнаруженных
маркеров.
Каждый обнаруженный маркер включает в себя:
- Положение его четырех углов на изображении (в исходном порядке);
- Идентификатор маркера;

Процесс обнаружения маркера состоит из двух основных этапов:


Первый этап обнаружение маркер-кандидатов. На этом этапе
изображение анализируется, чтобы найти квадратные фигуры, которые
являются кандидатами на роль маркеров. Этап начинается с адаптивного
порога для сегментации маркеров, затем контуры извлекаются из порогового
изображения, а те, которые не являются выпуклыми или не
аппроксимируются квадратной формой, отбрасываются. Также применяется
некоторая дополнительная фильтрация (удаление слишком малых или
слишком больших контуров, удаление контуров слишком близко друг к
другу и т. д.).
На втором этапе, после обнаружения кандидатов, необходимо
определить, являются ли они на самом деле маркерами, анализируя их
внутреннюю кодификацию. Этот шаг начинается с извлечения маркерных
битов каждого маркера. Для этого, во-первых, применяется перспективное
преобразование для получения маркера в его канонической форме. Затем для
канонического изображения находится пороговое значение с помощью
метода Otsu для разделения белых и черных битов. Изображение делится на
ячейки в соответствии с размером маркера и размером границы. Количеством
черных или белых пикселей на каждой ячейке подсчитывается, чтобы
определить, является ли ячейка белой или черной. Наконец, биты
анализируют, чтобы определить, принадлежит ли маркер конкретному
словарю, и при необходимости используются методы коррекции ошибок [8].
37
9 Обзор использованного программного обеспечения
9.1 Среда разработки
В качестве среды разработки системы видео-мониторинга
парковочного пространства использовалась среда разработки Microsoft Visual
Studio 2015.
Microsoft Visual Studio — линейка продуктов компании Microsoft,
включающих интегрированную среду разработки программного обеспечения
и ряд других инструментальных средств. Данные продукты позволяют
разрабатывать как консольные приложения, так и приложения с графическим
интерфейсом, в том числе с поддержкой технологии Windows Forms, а также
веб-сайты, веб-приложения, веб-службы как в родном, так и в управляемом
кодах для всех платформ, поддерживаемых Windows, Windows Mobile,
Windows CE, .NET Framework, Xbox, Windows Phone .NET Compact
Framework и Silverlight.
Visual Studio включает в себя редактор исходного кода с поддержкой
технологии IntelliSense и возможностью простейшего рефакторинга кода.
Встроенный отладчик может работать как отладчик уровня исходного кода,
так и отладчик машинного уровня. Остальные встраиваемые инструменты
включают в себя редактор форм для упрощения создания графического
интерфейса приложения, веб-редактор, дизайнер классов и дизайнер схемы
базы данных. Visual Studio позволяет создавать и подключать сторонние
дополнения (плагины) для расширения функциональности практически на
каждом уровне, включая добавление поддержки систем контроля версий
исходного кода (как, например, Subversion и Visual SourceSafe), добавление
новых наборов инструментов (например, для редактирования и визуального
проектирования кода на предметно-ориентированных языках
программирования) или инструментов для прочих аспектов процесса
разработки программного обеспечения (например, клиент Team Explorer для
работы с Team Foundation Server) [9].

38
9.2 Платформа .NET Framework
Платформа .NET Framework — это технология, которая поддерживает
создание и выполнение нового поколения приложений и веб-служб XML.
При разработке платформы .NET Framework учитывались следующие цели.
Обеспечение согласованной объектно-ориентированной среды
программирования для локального сохранения и выполнения объектного
кода, для локального выполнения кода, распределенного в Интернете, либо
для удаленного выполнения.
Обеспечение среды выполнения кода, минимизирующей конфликты
при развертывании программного обеспечения и управлении версиями.
Обеспечение среды выполнения кода, гарантирующей безопасное
выполнение кода, включая код, созданный неизвестным или не полностью
доверенным сторонним изготовителем.
Обеспечение среды выполнения кода, исключающей проблемы с
производительностью сред выполнения сценариев или интерпретируемого
кода.
Обеспечение единых принципов работы разработчиков для разных
типов приложений, таких как приложения Windows и веб-приложения.
Разработка взаимодействия на основе промышленных стандартов,
которое обеспечит интеграцию кода платформы .NET Framework с любым
другим кодом.
Платформа .NET Framework состоит из общеязыковой среды
выполнения (среды CLR) и библиотеки классов .NET Framework. Основой
платформы .NET Framework является среда CLR. Среду выполнения можно
считать агентом, который управляет кодом во время выполнения и
предоставляет основные службы, такие как управление памятью, управление
потоками и удаленное взаимодействие. При этом накладываются условия
строгой типизации и другие виды проверки точности кода, обеспечивающие
безопасность и надежность. Фактически основной задачей среды выполнения
является управление кодом. Код, который обращается к среде выполнения,

39
называют управляемым кодом, а код, который не обращается к среде
выполнения, называют неуправляемым кодом. Библиотека классов является
комплексной объектно-ориентированной коллекцией допускающих
повторное использование типов, которые применяются для разработки
приложений — начиная с обычных приложений, запускаемых из командной
строки, и приложений с графическим интерфейсом пользователя (GUI), и
заканчивая приложениями, использующими последние технологические
возможности ASP.NET, такие как Web Forms и веб-службы XML.
Платформа .NET Framework может размещаться неуправляемыми
компонентами, которые загружают среду CLR в собственные процессы и
запускают выполнение управляемого кода, создавая таким образом
программную среду, позволяющую использовать средства как управляемого,
так и неуправляемого выполнения. Платформа .NET Framework не только
предоставляет несколько базовых сред выполнения, но также поддерживает
разработку базовых сред выполнения независимыми производителями.
Например, ASP.NET размещает среду выполнения и обеспечивает
масштабируемую среду для управляемого кода на стороне сервера. ASP.NET
работает непосредственно со средой выполнения, чтобы обеспечить
выполнение приложений ASP.NET и веб-служб XML, обсуждаемых ниже в
этом разделе.
Обозреватель Internet Explorer может служить примером
неуправляемого приложения, размещающего среду выполнения (в виде
расширений типов MIME). Размещение среды выполнения в обозревателе
Internet Explorer позволяет внедрять управляемые компоненты или элементы
управления Windows Forms в HTML-документы. Такое размещение среды
позволяет выполнять управляемый мобильный код и пользоваться его
существенными преимуществами, в частности выполнением в условиях
неполного доверия и изолированным хранением файлов.

40
Среда CLR и библиотеки взаимосвязаны с пользовательскими
приложениями и всей системой. Управляемый код работает в пределах более
широкой архитектуры в соответствии с рисунком 15.

Рисунок 15 - .NET Framework в контексте

Среда CLR управляет памятью, выполнением потоков, выполнением


кода, проверкой безопасности кода, компиляцией и другими системными
службами. Эти средства являются внутренними для управляемого кода,
который выполняется в среде CLR.
По соображениям безопасности управляемым компонентам
присваиваются разные степени доверия, зависящие от ряда факторов, в число
которых входит их происхождение (например, Интернет, сеть предприятия
или локальный компьютер). Это означает, что управляемый компонент
может или не может выполнять операции доступа к файлам, операции
доступа к реестру или другие важные функции, даже если он используется в
одном активном приложении.
Среда выполнения обеспечивает управление доступом для кода.
Например, пользователи могут доверить исполняемому приложению,

41
внедренному в веб-страницу, воспроизведение анимации на экране или
звукозаписи, не позволяя ему при этом получить доступ к личным данным,
файловой системе или сети. Таким образом, средства безопасности CLR
предоставляют подлинному развернутому в Интернете программному
обеспечению исключительно богатые функции.
Среда выполнения также обеспечивает надежность кода, реализуя
инфраструктуру строгой типизации и проверки кода, которую называют
системой общих типов (CTS). Система общих типов обеспечивает
самоописание всего управляемого кода. Различные языковые компиляторы
корпорации Microsoft и независимых изготовителей создают управляемый
код, удовлетворяющий системе общих типов. Это означает, что управляемый
код может принимать другие управляемые типы и экземпляры, при этом
обеспечивая правильность типов и строгую типизацию.
Кроме того, управляемая среда выполнения исключает многие часто
возникающие проблемы с программным обеспечением. Например, среда
выполнения автоматически управляет размещением объектов и ссылками на
объекты, освобождая их, когда они больше не используются. Автоматическое
управление памятью исключает две наиболее часто возникающие ошибки
приложений: утечки памяти и недействительные ссылки на память.
Среда выполнения также повышает продуктивность разработчиков.
Например, программисты могут писать приложения на привычном языке
разработки, при этом используя все преимущества среды выполнения,
библиотеку классов и компоненты, написанные другими разработчиками на
других языках. Это доступно любому производителю компиляторов,
обращающихся к среде выполнения. Языковые компиляторы,
предназначенные для платформы .NET Framework, делают средства .NET
Framework доступными для существующего кода, написанного на
соответствующих языках, существенно облегчая процесс переноса
существующих приложений.

42
Хотя среда выполнения разрабатывалась для будущего программного
обеспечения, она также поддерживает сегодняшнее и вчерашнее
программное обеспечение. Взаимодействие управляемого и неуправляемого
кодов позволяет разработчикам использовать необходимые компоненты
COM и библиотеки DLL.
Среда выполнения разработана для повышения производительности.
Хотя общеязыковая среда выполнения предоставляет многие стандартные
службы времени выполнения, управляемый код никогда не
интерпретируется. Средство компиляции по требованию (JIT) позволяет
всему управляемому коду выполняться на машинном языке компьютера.
Между тем диспетчер памяти устраняет возможность фрагментации памяти и
увеличивает объем адресуемой памяти для дополнительного повышения
производительности.
И наконец, среда выполнения может размещаться в
высокопроизводительных серверных приложениях, таких как Microsoft SQL
Server и службы IIS (Internet Information Services). Такая инфраструктура
позволяет использовать управляемый код для написания собственной логики
программ, пользуясь при этом высочайшей производительностью лучших
производственных серверов, которые поддерживают размещение среды
выполнения.
Библиотека классов платформы .NET Framework представляет собой
коллекцию типов, которые тесно интегрируются со средой CLR. Библиотека
классов является объектно-ориентированной; предоставляя типы, из которых
управляемый код пользователя может наследовать функции. Это не только
упрощает работу с типами .NET Framework, но также уменьшает время,
затрачиваемое на изучение новых средств платформы .NET Framework.
Кроме того, компоненты независимых производителей можно легко
объединять с классами платформы .NET Framework.
Например, в классах коллекций .NET Framework реализуется набор
интерфейсов, которые можно использовать для разработки пользовательских

43
классов коллекций. Пользовательские классы коллекций будут без
затруднений объединяться с классами .NET Framework [10].
Как и ожидается от объектно-ориентированной библиотеки классов,
типы .NET Framework позволяют решать типовые задачи программирования,
включая работу со строками, сбор данных, подключения к базам данных и
доступ к файлам. В дополнение к этим обычным задачам библиотека классов
содержит типы, поддерживающие многие специализированные сценарии
разработки.
Например, можно использовать платформу .NET Framework для
разработки следующих типов приложений и служб:
- консольные приложения;
- приложения с графическим интерфейсом пользователя Windows
(Windows Forms);
- приложения Windows Presentation Foundation (WPF);
- приложения ASP.NET; См. раздел Разработка веб-приложений с
помощью ASP.NET;
- службы Windows;
- сервисноориентированные приложения с помощью Windows
Communication Foundation (WCF);
- приложения поддерживающие бизнес-процессы Windows
Workflow Foundation (WF);

9.3 Язык программирования


Система видео-мониторинга парковочного пространства была написана
на языке программирования C#.
C# — объектно-ориентированный язык программирования. Разработан
в 1998—2001 годах группой инженеров под руководством Андерса
Хейлсберга в компании Microsoft как язык разработки приложений для
платформы Microsoft .NET Framework и впоследствии был стандартизирован
как ECMA-334 и ISO/IEC 23270.

44
C# относится к семье языков с C-подобным синтаксисом, из них его
синтаксис наиболее близок к C++ и Java. Язык имеет статическую
типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе
операторов явного и неявного приведения типа), делегаты, атрибуты,
события, свойства, обобщённые типы и методы, итераторы, анонимные
функции с поддержкой замыканий, LINQ, исключения, комментарии в
формате XML [11].
Переняв многое от своих предшественников — языков C++, Pascal,
Модула, Smalltalk и, в особенности, Java — С#, опираясь на практику их
использования, исключает некоторые модели, зарекомендовавшие себя как
проблематичные при разработке программных систем, например, C# в
отличие от C++ не поддерживает множественное наследование классов
(между тем допускается множественное наследование интерфейсов).
Существует несколько реализаций C#:
- Реализация C# в виде компилятора csc.exe включена в состав
.NET Framework (включая .NET Micro Framework, .NET Compact
Framework и его реализации под Silverlight и Windows Phone 7);
- В составе проекта Rotor (Shared Source Common Language
Infrastructure) компании Microsoft;
- Проект Mono включает в себя реализацию C# с открытым
исходным кодом;
- Проект DotGNU также включает компилятор C# с открытым
кодом;
- DotNetAnywhere — ориентированная на встраиваемые системы
реализация CLR, поддерживает практически всю спецификацию
C# 2.0;

9.4 Используемые библиотеки


Для нормализации изображения и выделения контуров, а также
доступа к видеопотоку камеры используется библиотека EmguCV.

45
Emgu CV является кроссплатформенным .Net дополнением для
библиотеки OpenCV для обработки изображений. Разработано для работы с
.NET совместимыми языками, такими как C #, VB, VC ++, IronPython и т.д.,
может быть использовано в Visual Studio, Xamarin, работает с Windows,
Linux, Mac OS X, IOS, Android и Windows Phone.
В соответствии с рисунком 16 Emgu CV имеет два слоя:
- Базовый слой (Слой 1) содержит функции, структуры и
перечисления которые напрямую отражены в OpenCV;
- Второй слой (Слой 2) содержит классы которые дополнены
преимуществами платформы .NET [12];

Рисунок 16 - Архитектура EmguCV

46
OpenCV (англ. Open Source Computer Vision Library, библиотека
компьютерного зрения с открытым исходным кодом) — библиотека
алгоритмов компьютерного зрения, обработки изображений и численных
алгоритмов общего назначения с открытым кодом. Реализована на C/C++,
также разрабатывается для Python, Java, Ruby, Matlab, Lua и других языков.
Может свободно использоваться в академических и коммерческих целях —
распространяется в условиях лицензии BSD [13].
Для распознавания найденных символов используется библиотека
tesseract ocr. Решено было использовать данную библиотеку потому что она
популярна, бесплатна и есть поддержка русского языка.
Tesseract — свободная компьютерная программа для распознавания
текстов, разрабатывавшаяся Hewlett-Packard с середины 1980-х по середину
1990-х, а затем 10 лет «пролежавшая на полке». В августе 2006 г. Google
купил её и открыл исходные тексты под лицензией Apache 2.0 для
продолжения разработки. В настоящий момент программа уже работает с
UTF-8, поддержка языков (включая русский с версии 3.0) осуществляется с
помощью дополнительных модулей [14].
Для поиска фрагмента изображения с автомобильным номером
используется библиотека openalprnet. Найденное изображение с
регистрационным номером автомобиля подвергается дальнейшей обработке
разработанной программой с целью определения номера. Данная библиотека
еще и распознает сам номер, но делает это не всегда правильно, так как она
не рассчитана на русский формат номеров. Эти результаты распознавания
проверяются на соответствие шаблону, и дополняют результаты программы.
OpenALPR это библиотека с открытым исходным кодом для
автоматического распознавания номерных знаков. Написанная на С++ с
привязками к C#, Java, Node.js, и Python. Библиотека анализирует
изображения и видеопотоки для идентификации номерных знаков. В
результате на выходе выдает изображение с номерным знаком и
распознанный номер [15].

47
10 Программная реализация
10.1 Программа распознавания автомобильных номеров
Главная форма программы распознавания автомобильных номеров
в соответствии с рисунком 17, имеет элементы:
- Кнопка «Старт» для запуска мониторинга парковочных мест;
- Кнопка «Стоп» для остановки мониторинга парковочных мест;
- Кнопка «Настройки» открывает форму с настройками
программы;
- Элемент PictureBox в который выводятся кадры из видео;
- Кнопка «…» для загрузки тестовых примеров автомобильных
номеров;

Распознавание номера происходит в классе NumberRecognizer


(Приложение A), который в свою очередь использует функции обработки
изображений из класса ImageFunctions (Приложение Б), например, функцию
бинаризации изображения. Контуров в номере находится больше чем нужно,
необходимо удалить лишние и отсортировать оставшиеся в правильном
порядке это происходит в классе BoxFunctions (Приложение B). В результате
получаем набор изображений с каждым отдельным символом
автомобильного номера. Каждый символ передается на распознавание в
класс MyTesseract (Приложение Г). После распознавания необходимо
проверить получившийся номер, для этого есть класс NumberNormalize
(Приложение Д), который кроме проверки может исправить некоторые
ошибки распознавания. Например, если первый символ номера распознался
как ноль, то очевидно, что это должна быть буква «О». Для подключения к
камере используется класс MyCamera (Приложение Ж).
Распознавание номера производится несколько раз, после чего самый
часто встречающийся результат посылается на веб-сервер в формате json.
Веб-сервер осуществляет бронирование места для клиента.

48
Рисунок 17- Программа распознавания номеров

В программе есть возможность выбора источника видеопотока. Можно


выбрать в качестве источника видео IP камеру с поддержкой протокола RTSP
или можно выбрать USB камеру, подключенную в компьютеру. Форма
настроек в соответствии с рисунком 18.имеет следующие поля: IP адрес
камеры, порт, логин и пароль.

Рисунок 18 - Форма настроек программы

49
На используемом компьютере распознавание номера происходит в
среднем за 600мс. Проведя анализ затраченных ресурсов были составлены
минимальные системные требования к серверу на котором будет работать
программа распознавания регистрационных номеров.
Минимальные:
ОС: 64-bit : Win Vista, Win 7, Win 8, Win 10
Процессор: Intel Core 2 duo
Оперативная память: 2 ГБ ОЗУ
Место на диске: 200 МБ
Доступ в сеть
Требуемое ПО: .NET Framework 4

10.2 Программа распознавания свободных мест


За каждым парковочным местом закреплена уникальная графическая
метка. Если программа не может распознать метку в кадре, значит место
занято, иначе свободно. Лучшего качества распознавания можно добиться,
используя контрастные цвета. Например, если цвет метки черный, то ее
лучше нанести на белую поверхность.
В соответствии с рисунком 19 главная форма программы имеет
следующие элементы:
- Кнопка «Print Aruco Board» для вывода на печать Aruco меток;
- Кнопка «Старт» для запуска мониторинга парковочных мест;
- Кнопка «Стоп» для остановки мониторинга парковочных мест;
- Кнопка «Настройки» открывает форму с настройками
программы;
- Элемент PictureBox в который выводятся кадры из видео;
Для распознавания меток на изображении используется класс Markers
(Приложение Ж), который в свою очередь обновляет состояние места,
представленного классом Spot (Приложение И). Дабы исключить

50
вероятность ошибочного распознавания состояния места результат должен
повториться несколько раз, за этим следит класс Spot.

Рисунок 19 - Программа распознавания свободных мест

Чтобы пользователи могли иметь актуальную информацию


необходимо чаще обновлять информацию о местах в БД. С другой стороны,
слишком частое обновление БД создаст дополнительную нагрузку на СУБД.
Поэтому важно было выбрать оптимальный период обновления. Проведя
анализ данной проблемы было решено сделать период равным 1 секунде.
Компонент таймер с заданным периодом берет информацию из класса Spot и
обновляет данные в БД.
Для парковки одной камеры будет недостаточно. Для использования
нескольких камер нужно будет запустить несколько экземпляров программы.
При выбранном размере метки кодов хватит на 216 (65536) парковочных мест.
При необходимости можно увеличить число возможных комбинаций
графических меток, но это может негативно казаться на качестве
распознавания.
В соответствии с рисунком 20 в окне настроек указывается следующее
для сетевой камеры:
51
- IP адрес;
- Порт;
- Логин;
- Пароль;
Или можно выбрать USB камеру из списка, если к компьютеру
подлечено более одной камеры.
Кроме того, необходимо указать какие парковочные места видит
выбранная камера, это важно, так как программа не должна менять статус
мест в базе данных, за которыми она не наблюдает. Все настройки
программы сохраняются, дабы пользователю не приходилось каждый раз их
вводить заново.

Рисунок 20 - Окно настроек

Проанализировав затраты вычислительных ресурсов были составлены


минимальные системные требования.
Минимальные:
ОС: 64-bit: Win Vista, Win 7, Win 8, Win 10
Процессор: Intel Core 2 duo
Оперативная память: 2 ГБ ОЗУ
Место на диске: 120 МБ
Доступ в сеть
Требуемое ПО: .NET Framework 4

52
ЗАКЛЮЧЕНИЕ
В результате выполнения выпускной квалификационной работы была
достигнута поставленная цель и выполнены поставленные задачи:
- Выполнен обзор существующих аналогов;
- Произведена настройка видеооборудования;
- Проведен анализ технологий распознавания номеров;
- Выполнен анализ технологий мониторинга парковочных мест;
- Сделан обзор используемого ПО;
- Разработана система видео-мониторинга парковочного пространства;
- Разработанная система опробована на макете парковки;

Применяя современные технологии видеоанализа можно сделать


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

53
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1 Умная парковка [Электронный ресурс] АБС авто режим доступа:
http://www.abs-magazine.ru/article/umnaja-parkovka (дата обращения
10.05.2017)
2 Parkeon [Электронный ресурс] - Режим доступа
http://www.parkeon.co.uk (дата обращения 10.05.2017)
3 Официальный сайт компании Микком [Электронный ресурс] - Режим
доступа: http://miccom.ru/products/pm-about/pm1 (дата обращения
10.05.2017)
4 «Умные парковки» – новый подход к решению проблемы паркинга в
городах [Электронный ресурс]: Официальный сайт компании Аксиома
Групп - Режим доступа: http://xn--80aehoibjimhm4a0i.xn--p1ai/ (дата
обращения 10.05.2017)
5 Руководство установке IP-камеры видеонаблюдения Cisco Video
Surveillance 6000P [Электронный ресурс]: Сайт компании Cisco -
Режим доступа:
http://www.cisco.com/assets/global/RU/documentation/6000Phig-rus.pdf
(дата обращения 12.05.2017)
6 Компьютерное зрение [Электронный ресурс]: Habrahabr Режим
доступа: https://habrahabr.ru/company/yandex/blog/203136/ (дата
обращения 10.05.2017)
7 Распознавание номеров: от А до 9 [Электронный ресурс]: Habrahabr
Режим доступа: https://habrahabr.ru/company/recognitor/blog/221891/
(дата обращения 13.05.2017)
8 Detection of ArUco Markers [Электронный ресурс]: сайт openCV -
Режим доступа:
http://docs.opencv.org/3.1.0/d5/dae/tutorial_aruco_detection.html (дата
обращения 13.05.2017)

54
9 Visual Studio [Электронный ресурс]: Wikipedia - Режим доступа:
https://ru.wikipedia.org/wiki/Microsoft_Visual_Studio (дата обращения
15.05.2017)
10 Общие сведения о платформе .NET Framework [Электронный ресурс]:
Microsoft Режим доступа: https://msdn.microsoft.com/ru-
ru/library/zw4w595w(v=vs.110).aspx (дата обращения 15.05.2017)
11 C Sharp [Электронный ресурс]: Wikipedia Режим доступа:
https://ru.wikipedia.org/wiki/C_Sharp (дата обращения 15.05.2017)
12 Библиотека EmguCV [Электронный ресурс]: EmguCV Режим доступа:
http://www.emgu.com/wiki/index.php/Tutorial (дата обращения
16.05.2017)
13 Библиотека OpenCV [Электронный ресурс] Режим доступа:
http://opencv.org
14 Tesseract OCR [Электронный ресурс] github хостинг - Режим доступа:
https://github.com/tesseract-ocr (дата обращения 16.05.2017)
15 OpenAlpr [Электронный ресурс] Режим доступа:
http://doc.openalpr.com/ (дата обращения 16.05.2017)

55
ПРИЛОЖЕНИЕ А
Класс для распознавания номеров
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using openalprnet;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;

namespace ALPRV9000
{
class NumberRecognizer
{
public NumberRecognizer()
{}

private List<Bitmap> images_steps = new List<Bitmap>();


public List<CompareResult> compare_results = new List<CompareResult>();
public List<Bitmap> getStepsImages()
{ return images_steps; }

private void AddUmatToLog(List<UMat> images)


{
foreach (var image in images)
images_steps.Add(image.Clone().Bitmap);
}

private void AddBitmapToLog(Bitmap image)


{ images_steps.Add(image); }

private void AddBitmapsToLog(List<Bitmap> images)


{ images_steps.AddRange(images); }

public List<string> getNumberCar(Bitmap image)


{
images_steps.Clear();
List<Bitmap> numberPlate = findNumberPlate(image);
if (numberPlate.Any())
Recognize(numberPlate[0]);
numberPlate = null;
return numbers;
}

//Mat filteredGray_global;
private void Recognize(Image imageSource)
{
string number = "";
MyTesseract myTesseract = new MyTesseract();

56
using (Bitmap bitMap = new Bitmap(imageSource))
using (Bitmap ExtendedBitMap = ImageFunctions.ExtendBitmap(bitMap, new
Size(bitMap.Width, bitMap.Height + 20), new Point(0, 10), Brushes.White))
using (Mat imageMat = ImageFunctions.BitMapToMat(ExtendedBitMap))//В нужный
формат
using (Mat gray = new Mat()) //Серое
{
CvInvoke.CvtColor(imageMat, gray, ColorConversion.Bgr2Gray);
using (Mat grayResized = ImageFunctions.Resize(gray, new Size(600, 150)))
//Изменен размер
using (Mat filteredGray = ImageFunctions.FilterPlate(grayResized))//Контуры
using (Mat canny = new Mat())//Контуры
{
//filteredGray_global = filteredGray;//для отладки
CvInvoke.Canny(filteredGray, canny, 50, 100, 3, false);
using (VectorOfVectorOfPoint contours = new
VectorOfVectorOfPoint())//Контуры
using (Mat hierarchy = new Mat())//Какая то фигня
{
CvInvoke.FindContours(canny, contours, hierarchy, RetrType.List,
ChainApproxMethod.ChainApproxSimple);
//int[,] hierachy = CvInvoke.FindContourTree(canny, contours,
ChainApproxMethod.ChainApproxSimple);
List<RotatedRect> boxes = BoxFunctions.GetBoxesFromContours(contours, new
Size(10, 10), new Size(80, 100)); //Которбки не меньше указанного размера
//List<UMat> boxes_sizeFiltered = getNormImagesInContours(boxes,
grayResized); //для отладки
List<RotatedRect> boxes_smartFiltered =
BoxFunctions.RemoveRepeatedBoxes(boxes);//Убираем повторения
List<RotatedRect> boxes_sort =
BoxFunctions.SortBoxes(boxes_smartFiltered);//Сортируем в правильном порядке
List<UMat> plates = ImageFunctions.GetImagesInContours(boxes_sort,
filteredGray); //Картинки из контуров
List<UMat> filteredPlates = ImageFunctions.FilterPlates(plates);
//Отфильтрованные
List<UMat> resizedFilteredPlates = ImageFunctions.Resize(filteredPlates, new
Size(240, 180)); //меняем размер
List<Bitmap> segments =
ImageFunctions.UmatsToBitmaps(resizedFilteredPlates);
List<Bitmap> extendedContours = ImageFunctions.ExtendBitmaps(segments, 40,
40, new Point(20, 20), Brushes.Black);
number = myTesseract.GetNumberFromContours(extendedContours);
//Mat testtest = FilterPlateMat(filteredGray);
//number2 = getNumberFromPlate(testtest);
//AddBitmapToLog(grayResized.Clone().Bitmap);
//AddBitmapToLog((Bitmap)filteredGray.Bitmap.Clone());
AddBitmapToLog(canny.Clone().Bitmap);
//AddUmatToLog(filteredPlates);
//AddUmatToLog(boxes_sizeFiltered);
AddBitmapsToLog(extendedContours);
myTesseract = null;
boxes = null;

57
boxes_smartFiltered = null;
boxes_sort = null;
plates = null;
filteredPlates = null;
resizedFilteredPlates = null;
}
}
}
number = NumberNormalize.getNormalizeNumber(number);
if (number.Length==6)
{
numbers.Add(number);
}
}
List<Bitmap> numberPlate = new List<Bitmap>();
List<string> numbers = new List<string>();
private List<Bitmap> findNumberPlate(Bitmap image)
{
numberPlate.Clear();
numbers.Clear();
string config_file = "openalpr.conf";
string runtime_data_dir = "runtime_data";
using (var alpr = new AlprNet("eu", config_file, runtime_data_dir))
{
if (!alpr.IsLoaded())
{
throw(new Exception("Error initializing OpenALPR"));
}
alpr.DefaultRegion = "ru";

AlprResultsNet results = alpr.Recognize(image);

foreach (var result in results.Plates)


{
foreach(var topNPlates in result.TopNPlates)
{
string numb = NumberNormalize.getNormalizeNumber(topNPlates.Characters);
if (numb.Length == 6)
numbers.Add(numb);
List<Point> points = result.PlatePoints;
Rectangle rect = BoxFunctions.BoundingRectangle(points);
points = null;
using (Bitmap cropped = ImageFunctions.CropImage(image, rect))
numberPlate.Add(new Bitmap(cropped));
}
}
results = null;
}
return numberPlate;
}
}
}

58
ПРИЛОЖЕНИЕ Б
Класс содержащий функции обработки изображений
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using System;
using System.Collections.Generic;
using System.Drawing;
namespace ALPRV9000
{
class ImageFunctions
{
public static List<Bitmap> ExtendBitmaps(List<Bitmap> srcBitmaps, int addWidth, int
addHeight, Point point, Brush color)
{
List<Bitmap> extendedBitmaps = new List<Bitmap>();
foreach (var bitmap in srcBitmaps)
{
extendedBitmaps.Add(ExtendBitmap(
new Bitmap(bitmap), new Size(bitmap.Width + addWidth, bitmap.Height +
addHeight), new Point(addWidth / 2, addHeight / 2), Brushes.Black));
}
return extendedBitmaps;
}
public static Bitmap ExtendBitmap(Bitmap srcBitmap, Size newSize, Point point, Brush
color)
{
Bitmap newImage = new Bitmap(newSize.Width, newSize.Height,
srcBitmap.PixelFormat);
using (Graphics g = Graphics.FromImage(newImage))
{
// fill target image with white color
g.FillRectangle(color, 0, 0, newSize.Width, newSize.Height);
// place source image inside the target image
g.DrawImage(srcBitmap, point.X, point.Y);
}
return newImage;
}

public static Mat ExtendMat(Mat srcMat, Size newSize, Point point, Brush color)
{
Bitmap tmp = new Bitmap(srcMat.Bitmap);
Bitmap bitMap = ExtendBitmap(tmp, newSize, point, color);
//tmp = null;
Mat extendedMat = BitMapToMat(bitMap);
return extendedMat;
}

public static Mat BitMapToMat(Bitmap bgr_image)


{
Image<Bgr, byte> img1 = new Image<Bgr, byte>(bgr_image);

59
return img1.Mat;
}

public static Bitmap CropImage(Bitmap img, Rectangle cropArea)


{
try
{
return img.Clone(cropArea, img.PixelFormat);
}
catch (OutOfMemoryException ex)
{
return (Bitmap)img.Clone();
}
}

public static Mat FilterPlate(Mat plate)


{
Mat thresh = new Mat();
CvInvoke.Threshold(plate, thresh, 100, 255, ThresholdType.Otsu);
CvInvoke.Erode(thresh, thresh, null, new Point(-1, -1), 1, BorderType.Constant,
CvInvoke.MorphologyDefaultBorderValue);
CvInvoke.Dilate(thresh, thresh, null, new Point(-1, -1), 1, BorderType.Constant,
CvInvoke.MorphologyDefaultBorderValue);

return thresh;
}

public static List<UMat> FilterPlates(List<UMat> plates)


{
List<UMat> threshes = new List<UMat>();
foreach (var plate in plates)
{
UMat thresh = FilterPlate(plate);
threshes.Add(thresh.Clone());
}
return threshes;
}

public static UMat FilterPlate(UMat plate)


{
UMat thresh = new UMat();
CvInvoke.Threshold(plate, thresh, 100, 255, ThresholdType.BinaryInv);
CvInvoke.Erode(thresh, thresh, null, new Point(-1, -1), 1, BorderType.Constant,
CvInvoke.MorphologyDefaultBorderValue);
CvInvoke.Dilate(thresh, thresh, null, new Point(-1, -1), 1, BorderType.Constant,
CvInvoke.MorphologyDefaultBorderValue);

return thresh;
}

public Mat FilterPlateMat(Mat plate)


{

60
Mat thresh = new Mat();
CvInvoke.Threshold(plate, thresh, 100, 255, ThresholdType.BinaryInv);
CvInvoke.Erode(thresh, thresh, null, new Point(-1, -1), 1, BorderType.Constant,
CvInvoke.MorphologyDefaultBorderValue);
CvInvoke.Dilate(thresh, thresh, null, new Point(-1, -1), 1, BorderType.Constant,
CvInvoke.MorphologyDefaultBorderValue);

return thresh;
}

public static Mat Resize(Mat source, Size size)


{
Mat dest = new Mat();
double scale = Math.Min((float)size.Width / (float)source.Size.Width, (float)size.Height /
(float)source.Size.Height);
Size newSize = new Size((int)Math.Round(source.Size.Width * scale),
(int)Math.Round(source.Size.Height * scale));
CvInvoke.Resize(source, dest, newSize, 0, 0, Inter.Cubic);
return dest;
}

public static UMat Resize(UMat source, Size size)


{
UMat dest = new UMat();
double scale = Math.Min((float)size.Width / (float)source.Size.Width, (float)size.Height /
(float)source.Size.Height);
Size newSize = new Size((int)Math.Round(source.Size.Width * scale),
(int)Math.Round(source.Size.Height * scale));
CvInvoke.Resize(source, dest, newSize, 0, 0, Inter.Cubic);
return dest;
}

public static List<UMat> Resize(List<UMat> sources, Size size)


{
List<UMat> dest = new List<UMat>();
foreach (var src in sources)
{
dest.Add(Resize(src, size));
}
return dest;
}

public static List<UMat> GetImagesInContours(List<RotatedRect> boxes, Mat from)


{
List<UMat> imagesMat = new List<UMat>();
foreach (var box in boxes)
{
float height = Math.Max(box.Size.Height, box.Size.Width);
float width = Math.Min(box.Size.Height, box.Size.Width);
//float height = box.Size.Height;
//float width = box.Size.Width;
PointF[] destCorners;

61
if (box.Size.Height > box.Size.Width)
{
destCorners = new PointF[]
{
new PointF(0, height - 1),
new PointF(0, 0),
new PointF(width - 1, 0),
new PointF(width - 1, height - 1)};
}
else
{
destCorners = new PointF[]
{
new PointF(width - 1, height - 1),
new PointF(0, height - 1),
new PointF(0, 0),
new PointF(width - 1, 0)};
}
PointF[] srcCorners = box.GetVertices();

using (Mat rot = CvInvoke.GetAffineTransform(srcCorners, destCorners))


using (UMat tmp1 = new UMat())
{
CvInvoke.WarpAffine(from, tmp1, rot, Size.Round(new SizeF(width, height)));
imagesMat.Add(tmp1.Clone());
}
}
return imagesMat;
}

public static List<Bitmap> UmatsToBitmaps(List<UMat> umats)


{
List<Bitmap> bitmaps = new List<Bitmap>();
foreach (var umat in umats)
{
bitmaps.Add((Bitmap)umat.Bitmap.Clone());
}
return bitmaps;
}
}
}

62
ПРИЛОЖЕНИЕ В
Класс, содержащий функции для работы с контурами
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
namespace ALPRV9000
{
class BoxFunctions
{
public static bool CmpBoxes(RotatedRect box1, RotatedRect box2)
{
bool result = false;//Если не равны

//Левый нижний угол box1


float box1_x1 = box1.Center.X - box1.Size.Width / 2;
float box1_y1 = box1.Center.Y - box1.Size.Height / 2;
//Правый верхний угол box1
float box1_x2 = box1.Center.X + box1.Size.Width / 2;
float box1_y2 = box1.Center.Y + box1.Size.Height / 2;
//Левый нижний угол box2
float box2_x1 = box2.Center.X - box2.Size.Width / 2;
float box2_y1 = box2.Center.Y - box2.Size.Height / 2;
//Правый верхний угол box2
float box2_x2 = box2.Center.X + box2.Size.Width / 2;
float box2_y2 = box2.Center.Y + box2.Size.Height / 2;
float tolerance_x = box1.Size.Width / 7;
float tolerance_y = box1.Size.Height / 7;
if (box1_x1 > box2_x1 && box1_x2 < box2_x2)
{
if (box1_y1 > box2_y1 && box1_y2 < box2_y2)
{
result = true; //Box1 внутри Box2
}
}
if (box2_x1 > box1_x1 && box2_x2 < box1_x2)
{
if (box2_y1 > box1_y1 && box2_y2 < box1_y2)
{
result = true; //Box2 внутри Box1
}
}
if (box1.Center.X < box2.Center.X + tolerance_x && box1.Center.X > box2.Center.X -
tolerance_x)
{
if (box1.Center.Y < box2.Center.Y + tolerance_y && box1.Center.Y > box2.Center.Y
- tolerance_y)

63
{
if (box1.Size.Height < box2.Size.Height + tolerance_x && box1.Size.Height >
box2.Size.Height - tolerance_x)
{
if (box1.Size.Width < box2.Size.Width + tolerance_y && box1.Size.Width >
box2.Size.Width - tolerance_y)
{
result = true;
}
}
}
}
return result;
}
public static List<RotatedRect> GetBoxesFromContours(VectorOfVectorOfPoint contours,
Size minSize, Size maxSize)
{
List<RotatedRect> boxes = new List<RotatedRect>();
for (int i = 0; i < contours.Size; i++)
{
RotatedRect box = CvInvoke.MinAreaRect(contours[i]);
if (box.Size.Height < minSize.Height || box.Size.Width < minSize.Width) continue;
if (box.Size.Height > maxSize.Height || box.Size.Width > maxSize.Width) continue;
boxes.Add(box);
}
return boxes;
}
public static List<int> CheckBoxInArray(List<RotatedRect> boxes, RotatedRect box)
{
List<int> indexes_remove = new List<int>();
for (int i = 0; i < boxes.Count; i++)
{
if (BoxFunctions.CmpBoxes(boxes[i], box))
{

indexes_remove.Add(i);
}
}
return indexes_remove;
}
public static List<RotatedRect> RemoveRepeatedBoxes(List<RotatedRect> boxes)
{
List<RotatedRect> boxes_result = new List<RotatedRect>();
List<int> indexes_remove = new List<int>();
for (int i = 0; i < boxes.Count; i++)
{
indexes_remove = CheckBoxInArray(boxes_result, boxes[i]);
if (indexes_remove.Count() == 0)
boxes_result.Add(boxes[i]); //Если в массиве нет такого
else
{
List<RotatedRect> temp = new List<RotatedRect>();

64
for (int z = 0; z < boxes_result.Count; z++)
{
if (indexes_remove.Contains(z)) continue;
temp.Add(boxes_result[z]);
}
boxes_result = new List<RotatedRect>(temp.ToArray<RotatedRect>());
boxes_result.Add(boxes[i]); //Если в массиве нет такого
}
}
return boxes_result;
}

public static List<RotatedRect> SortBoxes(List<RotatedRect> boxes)


{
List<RotatedRect> sortBoxes = new List<RotatedRect>(boxes);
for (int i = 0; i < sortBoxes.Count - 2; i++)
{
bool exchange = false;
for (int j = 0; j < sortBoxes.Count - i - 1; j++)
{

if (sortBoxes[j].Center.X > sortBoxes[j + 1].Center.X)


{
RotatedRect tmp = sortBoxes[j];
sortBoxes[j] = sortBoxes[j + 1];
sortBoxes[j + 1] = tmp;
exchange = true;
}
}
if (!exchange) break;
}
return sortBoxes;
}

public static Rectangle BoundingRectangle(List<Point> points)


{
var minX = points.Min(p => p.X);
var minY = points.Min(p => p.Y);
var maxX = points.Max(p => p.X);
var maxY = points.Max(p => p.Y);
var height = maxY - minY;
var width = maxX - minX;
var needWidth = height * 6.5;
return new Rectangle(new Point(minX, minY), new Size(maxX - minX, maxY - minY));
}
}
}

65
ПРИЛОЖЕНИЕ Г
Класс оптического распознавания символов
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using Tesseract;
namespace ALPRV9000
{
class MyTesseract
{
private TesseractEngine _ocr;
public MyTesseract() {
_ocr = new TesseractEngine("NumberRecognizer", "rus", EngineMode.TesseractOnly);
_ocr.SetVariable("tessedit_char_whitelist", "АВЕКМНОРСТУХ-1234567890");
}
public string GetNumberFromContours(List<Bitmap> segments) {
string numbers = "1234567890";
string letters = "АВЕКМНОРСТУХ";
string letters_numbers = letters + "-" + numbers;
string number = "";//Тут будет номер
for (int i = 0; i < segments.Count; i++)
{
string text = "";
using (Page page = _ocr.Process(segments[i], PageSegMode.SingleChar))
{
text = page.GetText();
number += text;
}
}
number = number.Replace("\n", "");
number = number.Replace(" ", "");
number = number.ToUpper();
return number;
}
public string GetNumberFromPlate(Bitmap plate) {
string number = "";//Тут будет номер
_ocr.SetVariable("tessedit_char_whitelist", "АВЕКМНОРСТУХ-1234567890");
string text = "";
using (Page page = _ocr.Process(plate, PageSegMode.SingleLine))
{
text = page.GetText();
number += text;
}
return number;
}
}
}

66
ПРИЛОЖЕНИЕ Д
Класс проверки номера и исправления ошибок
using System.Text;
using System.Text.RegularExpressions;
namespace ALPRV9000
{
class NumberNormalize
{
public static string getNormalizeNumber(string number)
{
char rus_O = 'О';
char eng_O = 'O';
string rus_chars = "АВЕКМНОРСТУХ";
string eng_chars = "ABEKMHOPCTYX";
string pattern = @"[" + rus_chars + "0][0-9" + rus_O + "][0-9" + rus_O + "][0-9" +
rus_O + "][" + rus_chars + "0][" + rus_chars + "0]";
MatchCollection match = Regex.Matches(number, pattern, RegexOptions.IgnoreCase);
string pattern2 = @"[" + eng_chars + "0][0-9" + eng_O + "][0-9" + eng_O + "][0-9" +
eng_O + "][" + eng_chars + "0][" + eng_chars + "0]";
MatchCollection match2 = Regex.Matches(number, pattern2, RegexOptions.IgnoreCase);
StringBuilder result = new StringBuilder();
if (match.Count > 0)
result.Append(match[0].Value);
if (match2.Count > 0)
{
result.Append(match2[0].Value);
for (int i = 0; i < eng_chars.Length; i++)
result = result.Replace(eng_chars[i], rus_chars[i]);
}
if (result.Length == 6)
{
if (result[0] == '0')
result[0] = rus_O;
if (result[1] == rus_O)
result[1] = '0';
if (result[2] == rus_O)
result[2] = '0';
if (result[3] == rus_O)
result[3] = '0';
if (result[4] == '0')
result[4] = rus_O;
if (result[5] == '0')
result[5] = rus_O;
}
return result.ToString();
}
}
}

67
ПРИЛОЖЕНИЕ Е
Класс для подключения к видеокамере
using Emgu.CV;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
namespace Aruco
{
class MyCamera {
Mat _frame = new Mat();
Mat _frameCopy = new Mat();
private VideoCapture _capture = null;
private bool _captureInProgress;
bool netCamera = true;
public MyCamera() {
netCamera = false;
_capture = new VideoCapture(1);
_capture.ImageGrabbed += ProcessFrame;
}
string connection_string;
void tryConnect()
{
_capture = new VideoCapture(connection_string);//Сетевая камера
_capture.ImageGrabbed += ProcessFrame;
}
Thread thread1;
public MyCamera(string ip, int port, string login, string password) {
netCamera = true;
thread1 = new Thread(new ThreadStart(tryConnect));
thread1.IsBackground = true;
thread1.Name = "TryConnectThread";
thread1.Start();
string connection_string = "rtsp://" + login + ":" + password + "@" + ip +
"/StreamingSetting?version=1.0&action=getRTSPStream&ChannelID=1&ChannelName=Chann
el1";
this.connection_string = connection_string;
}
public delegate void GetFrame(Mat bitMap);
GetFrame getFrame;
public void setCallBack(GetFrame getFrame)
{
this.getFrame = getFrame;
}
private void ProcessFrame(object sender, EventArgs arg)
{
if (_capture != null && _capture.Ptr != IntPtr.Zero)

68
{
_capture.Retrieve(_frame, 0);
getFrame(_frame);
}
}
bool check(ProcessThreadCollection tc, ProcessThread t)
{
bool result = false;
for (int i = 0; i < tc.Count; i++)
{
if (tc[i].Id == t.Id) {
result = true;
break;
}
}
return result;
}
public void Start()
{
if(netCamera)
thread1.Join(5000);
try
{
_capture.Start();
_captureInProgress = true;
}
catch
{
throw new TimeoutException("Не удалось подключиться к камере");
}
}
public void Stop()
{
if (_capture != null)
{
_captureInProgress = false;
_capture.Pause();
}
}
public bool getCaptureProgress()
{
return _captureInProgress;
}
public void Pause()
{
_captureInProgress = false;
_capture.Pause();
}
}
}

69
ПРИЛОЖЕНИЕ Ж
Класс для оптического распознавания маркеров
using Emgu.CV;
using Emgu.CV.Aruco;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Aruco
{
class Markers
{
public Markers(int markersX, int markersY, int markersSeparation, int markersLength)
{
this.markersX = markersX;
this.markersY = markersY;
this.markersSeparation = markersSeparation;
this.markersLength = markersLength;
spots = new Spot[markersX * markersY];
for(int i=0; i<spots.Length; i++)
{
spots[i] = new Spot(i);
}
}
int markersX;
int markersY;
int markersSeparation;
int markersLength;
private Dictionary _dict;
Mat _cameraMatrix = new Mat();
Mat _distCoeffs = new Mat();
Spot[] spots;
private Dictionary ArucoDictionary
{
get
{
if (_dict == null)
{
_dict = new Dictionary(Dictionary.PredefinedDictionaryName.Dict4X4_100);
}
return _dict;
}
}
private GridBoard _gridBoard;
private GridBoard ArucoBoard

70
{
get
{
if (_gridBoard == null)
{
_gridBoard = new GridBoard(markersX, markersY, markersLength,
markersSeparation, ArucoDictionary);
}
return _gridBoard;
}
}
void refreshSpots(int[] arr)
{
for(int i=0; i<spots.Length; i++)
{
bool occupied = true;
for(int j=0; j<arr.Length; j++)
{
if (spots[i].getId() == arr[j])
{
occupied = false;
break;
}
}
spots[i].Occupied(occupied);
}}
public Spot[] GetSpots()
{ return spots; }
Mat rvecs = new Mat();
Mat tvecs = new Mat();
public Mat ProcessFrame(Mat _frame)
{
using (VectorOfInt ids = new VectorOfInt())
using (VectorOfVectorOfPointF corners = new VectorOfVectorOfPointF())
using (VectorOfVectorOfPointF rejected = new VectorOfVectorOfPointF())
{
DetectorParameters p = DetectorParameters.GetDefault();
ArucoInvoke.DetectMarkers(_frame, ArucoDictionary, corners, ids, p, rejected);
ArucoInvoke.RefineDetectedMarkers(_frame, ArucoBoard, corners, ids, rejected, null,
null, 10, 3, true, null, p);
refreshSpots(ids.ToArray());
if (ids.Size > 0)
{
ArucoInvoke.DrawDetectedMarkers(_frame, corners, ids, new MCvScalar(0, 255,
0));
if (!_cameraMatrix.IsEmpty && !_distCoeffs.IsEmpty)
{
ArucoInvoke.EstimatePoseSingleMarkers(corners, markersLength,
_cameraMatrix, _distCoeffs, rvecs, tvecs);
for (int i = 0; i < ids.Size; i++)
{
using (Mat rvecMat = rvecs.Row(i))

71
using (Mat tvecMat = tvecs.Row(i))
using (VectorOfDouble rvec = new VectorOfDouble())
using (VectorOfDouble tvec = new VectorOfDouble())
{
double[] values = new double[3];
rvecMat.CopyTo(values);
rvec.Push(values);
tvecMat.CopyTo(values);
tvec.Push(values);
ArucoInvoke.DrawAxis(_frame, _cameraMatrix, _distCoeffs, rvec, tvec,
markersLength * 0.5f);
}
}
}
}
}
return _frame;
}
public void printArucoBoard()
{
Size imageSize = new Size();
int margins = markersSeparation;
int w = markersX * (markersLength + markersSeparation) - markersSeparation + 2 *
margins;
int h = markersY * (markersLength + markersSeparation) - markersSeparation + 2 *
margins;
imageSize.Width = Math.Max(w, h);
imageSize.Height = Math.Max(w, h);
int borderBits = 1;
Mat boardImage = new Mat();
ArucoBoard.Draw(imageSize, boardImage, margins, borderBits);
bmIm = boardImage.Bitmap;
PrintImage();
}
private void PrintImage()
{
PrintDocument pd = new PrintDocument();
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog();
printPreviewDialog1.Document = pd;
printPreviewDialog1.ShowDialog();
}
void pd_PrintPage(object sender, PrintPageEventArgs e)
{
double cmToUnits = 100 / 2.54;
e.Graphics.DrawImage(bmIm, 0, 0, (float)(15 * cmToUnits), (float)(15 * cmToUnits));
}
Image bmIm;
}
}

72
ПРИЛОЖЕНИЕ И
Класс для хранения информации о местах

namespace Aruco
{
class Spot
{
int id;
bool occupied = false;
int counterNewState = 0;
public Spot(int id)
{
this.id = id;
}

public bool IsOccupied()


{
return occupied;
}

public int getId()


{
return id;
}

public void Occupied(bool recivedState)


{
if(recivedState != occupied)
{
counterNewState++;
if (counterNewState > 5)
{
occupied = recivedState;
counterNewState = 0;
}
}
else
{
counterNewState = 0;
}

}
}

73