Чтобы посмотреть этот PDF файл с форматированием и разметкой, скачайте его и откройте на своем компьютере.
1
iANPR
SDK
Версия
1.6
Документация
i
201
8
.
ИнтБуСофт
2
СОДЕРЖАНИЕ
Введение
1. Модули
1.1. Модуль распознавания
–
iANPR
anprPlate
Структура
ANPR
_
OPTIONS
Типы распознаваемых номеров
Тип
ANPR
_
CUSTOM
_
TYPE
anprPlateRect
LicenseValue
1.2.
Модуль
интерфейсов
–
iANPRinterface
1.3.
Потоковый
модуль
-
iANPRcapture
R. Инсталляция и использование
2.1. Windows
2.2. Linux
S. Примеры
на C/C++ для
Windows
3.1. Image
3.2. Image_new
3.3. Image_omp
3.4. Capture
3.5.
Capture
_(
iANPRcapture
)
3
.6. (iANPRcapture_motion)
3.7 Persptrans
4.
Примеры
на
других
языках
для
Windows
4.1.
C
#
4.1.1. Пример iANPRcapture_motion на
CC для iANPR SDK
4.2.
Delphi
5. Рекомендации к использованию
6. Как пользоваться Демо
-
версией iANPR SDK
Заключение
3
Введение
iANPR SDK
–
это
комплект средств разработки для
распознавания автомобильных номеров. Основная цель
–
обеспечить
автоматизированное распознавание автомобильных номеров на
основе библиотеки компьютерного зрения OpenCV. Возможности
библиотеки включают обработку
изображений
.
Основной язык
использования библиотеки
–
C/
C
++.
Версия
1.6
откомпилирована с версиями
OpenCV
2.4.13
,
при
необходимости (по просьбе Клиента
для
FULL
версий
) может быть
откомпилирована под другую версию.
Виды лицензий
iANPR FREE
Данный вид лицензии предназначен для
бесплатного использования библиотеки с ограниченными
возможностями распознавания: скорость работы искусственно
существенно замедлена. Данный вид лицензии можно использовать
только в ознакомительных и/или академических
целях. Не
допускается распространение программного продукта совместно с
данной библиотекой.
iANPR RUS PRO LIMITED
Это платная лицензияL которая
предоставляет все возможности по распознаванию стандартных и
транзитных российских номеров. Допускается использ
ование только
для собственных нужд внутри организации (или только физическим
лицом)L принявшей данную лицензию.
iANPR RUS PRO EXTENDED LIMITED
Это платная лицензияL
которая предоставляет все возможности по распознаванию
стандартных и транзитных российских номеровL а также остальных
типов номеровL присутствующих в данной версии. Допускается
использование только для собственных нужд внутри организ
ации (или
только физическим лицом)L принявшей данную лицензию.
iANPR RUS PRO FULL
Это платная лицензияL которая
предоставляет все возможности по распознаванию всех типов
номеров Российской ФедерацииL присутствующих в данной версии.
Допускается использован
ие для распространения собственного
программного продукта.
iANPR KAZ PRO LIMITED
Это платная лицензияL которая
предоставляет все возможности по распознаванию частных и номеров
организаций Казахстана (только прямоугольные однострочные).
4
Допускается использо
вание только для собственных нужд внутри
организации (или только физическим лицом)L принявшей данную
лицензию.
iANPR KAZ PRO
FULL
Это платная лицензияL которая
предоставляет все возможности по распознаванию частных и номеров
организаций Казахстана (только
прямоугольные однострочные).
Допускается использование для распространения собственного
программного продукта.
iANPR
TM
PRO LIMITED
Это платная лицензияL которая
предоставляет все возможности по распознаванию частных и номеров
организаций Туркменистана (т
олько прямоугольные однострочные).
Допускается использование только для собственных нужд внутри
организации (или только физическим лицом)L принявшей данную
лицензию.
iANPR
TM
PRO
FULL
Это платная лицензияL которая
предоставляет все возможности по распозна
ванию частных и номеров
организаций Туркменистана (только прямоугольные однострочные).
Допускается использование для распространения собственного
программного продукта.
iANPR
BY
PRO LIMITED
Это платная лицензияL которая
предоставляет все возможности по рас
познаванию номеров Беларуси.
Допускается использование только для собственных нужд внутри
организацииL принявшей данную лицензию.
iANPR
BY
PRO
FULL
Это платная лицензияL которая
предоставляет все возможности по распознаванию номеров Беларуси.
Допускается
использование для распространения собственного
программного продукта.
iANPR PL PRO LIMITED
Это платная лицензияL которая
предоставляет все возможности по распознаванию стандартных
номеров Польши. Допускается использование только для собственных
нужд внутри
организацииL принявшей данную лицензию.
iANPR
PL
PRO
FULL
Это платная лицензияL которая
предоставляет все возможности по распознаванию стандартных
номеров Польши. Допускается использование для распространения
собственного программного продукта.
iANPR
LV
PRO LIMITED
Это платная лицензияL которая
предоставляет все возможности по распознаванию стандартных
номеров Латвии. Допускается использование только для собственных
нужд внутри организацииL принявшей данную лицензию.
5
iANPR
LV
PRO
FULL
Это платная лицензи
яL которая
предоставляет все возможности по распознаванию стандартных
номеров Латвии. Допускается использование для распространения
собственного программного продукта.
iANPR
LT
PRO LIMITED
Это платная лицензияL которая
предоставляет все возможности по расп
ознаванию стандартных
номеров Литвы. Допускается использование только для собственных
нужд внутри организацииL принявшей данную лицензию.
iANPR
LT
PRO
FULL
Это платная лицензияL которая
предоставляет все возможности по распознаванию стандартных
номеров Литвы. Допускается использование для распространения
собственного программного продукта.
iANPR
EST
PRO LIMITED
Это платная лицензияL которая
предоставляет все
возможности по распознаванию стандартных
номеров Эстонии. Допускается использование только для
собственных нужд внутри организацииL принявшей данную лицензию.
iANPR
EST
PRO
FULL
Это платная лицензияL которая
предоставляет все возможности по распознаванию
стандартных
номеров Эстонии. Допускается использование для распространения
собственного программного продукта.
iANPR
UA
PRO LIMITED
Это платная лицензияL которая
предоставляет все возможности по распознаванию номеров Украины.
Допускается использование только для собственных нужд внутри
организацииL принявшей данную лицензию.
iANPR
UA
PRO
FULL
Это платная лицензияL которая
предоставля
ет все возможности по распознаванию номеров Украины.
Допускается использование для распространения собственного
программного продукта.
iANPR
MD
PRO LIMITED
Это платная лицензияL которая
предоставляет все возможности по распознаванию номеров Молдовы.
Допуск
ается использование только для собственных нужд внутри
организацииL принявшей данную лицензию.
iANPR
MD
PRO
FULL
Это платная лицензияL которая
предоставляет все возможности по распознаванию номеров Молдовы.
Допускается использование для распространения со
бственного
программного продукта.
iANPR PRO
FULL
ALL
Это платная лицензияL которая
предоставляет все возможности по распознаванию номеров
библиотеки
iANPR
для всех поддерживаемых на настоящий момент
6
стран. Допускается использование для распространения собс
твенного
программного продукта.
ARM
–
данное обозначение характеризует отдельный продуктL
на который распространяется тоже лицензионное соглашениеL но
другие правила ценообразования.
Допускается совмещение лицензий на распознавание номеров
разных стран. По
дробнее об этом и о ценах на продукцию на
странице:
http://intbusoft.com/
iANPR/
7
1. Модули
В версии
1.6
библиотека была поделена на S модуля:
модуль распознавания;
модуль интерфейсов;
потоковый модуль.
В модуле распознавания остались базовые функции для
распознавания автомобильных номеров.
Модуль интерфейсов предназначен для облегчения доступа к
функциям распознавания и предоставляет различные варианты
доступа.
Поток
овый модуль предназначен для объединения результатов
распознавания с нескольких кадров.
1.1.
Модуль распознавания
–
iA.0R
В данном модуле
(
iANPR.h
)
реализовано распознавание одного
изображения.
anprPlate
Функция поиска автомобильных номеров на
изображении
формата OpenCV.
int anprPlate(
IplImage* Image,
ANPR_OPTIONS Options,
int* AllNumber, CvRect* Rects,
char** Texts,
void
*
param
=
NULL
);
Параметры:
Image
–
входное изображе
ние в формате OpenCV (8
-
битное
1
-
канальное
или 8
-
битное S
-
канальное
в зависимости от параметров
Options.
type_number);
Options
–
настройки режима распознавания
в формате структуры
ANPR_OPTIONS
;
AllNumber
–
количество найденных номеров;
8
Rects
–
указатель на массив структур CvRect
(э
то структура из
библиотеки OpenCV)
L куда будут записаны зоны нахождения номеров;
Texts
–
указатель на массив указателей символьного типаL в которые
для каждого номера будет возвращаться текстL указатели должны
указывать на ранее выделенные области памяти
;
param
–
пока
не используется.
Функция anprPlate возвращает 0 при успешном нахождении хотя
бы одного номера. 1
–
не детектировано ни одного кандидата на
автомобильный номер
, 2
–
не найдено ни одного номера.
Помимо
этого может быть возвращена одна из следующих ошибокL
определенных в
iANPRerror.h
:
IMAGE_EMPTY
(
-
2
)
Изображение пустое
;
ERROR_TYPE_PLATE
(
-
100
)
Неподдерживаемый для данной
конфигурации тип номера
. НапримерL лицензия
iANPR RUS PRO
LIMITED
не поддерживает флаг типа номера
ANPR_RUSSIAN_PUBLIC
. Поэтому его использование будет
возвращать ошибку.
ERROR
_
TYPE
_
FOR
_
COLOR
(
-
101
)
Не соответствие типа
изображения и флага типа номера в структуре
ANPR_OPTIONS
.
Структура
ANPR_OPTIONS
Данная структура определяет режимы распознавания.
struct
ANPR
_
OPTIONS
{
char
sign
1 = '
i
',
sign
2 = '
a
',
sign
3 = '1';
//
служебная информацияL не должна модифицироваться
int
min
_
plate
_
size
; // Минимальная площадь номера
int
max
_
plate
_
siz
e
; // Максимальная площадь номера
int
_
Mode
; // Режимы детектирования
int
max
_
text
_
size
;
// Максимальное количество
символов номера + 1
int
type
_
number
;
// Тип автомобильного номера
int
flags
; // Дополнительные опции
void
*
custom
;
// Заполняется только для типа
ANPR
_
CUSTOM
_
TYPE
L иначе пусто
char
*
vers
= "1.6"; // Используемая версия
iANPR
SDK
. Если не задано (
vers
=
0)L то считается 1.5.
double
alpha
= 90.
0
;
/
/ Поворот вокруг оси
X
double
= 90.
0
;
// Поворот вокруг оси
Y
double
gamma
= 90.
0
;
// Поворот вокруг оси
Z
9
int
max
_
threads
= 1;
// Количество потоков
;
}
Минимальная и максимальная площади номеров ограничивают
поиск кандидатов
на автомобильные номера
. Площадь номера
определяется
произведением ширины номера на его высоту. Если
необходимо задавать номера Российской Федерации через ширинуL
то можно использовать следующий пересчет:
min_plate_size = min_plate_width * min_plate_
height
;
max_plate_size = max_plate_width * max_plate_
height
;
Где
min
_
plate
_
width
–
минимальная
ширина
номера
,
m
ax
_
plate
_
width
–
м
аксимальная
ширина
номера
,
min
_
plate
_
height
–
минимальная
высота
номера
,
m
ax_
plate
_
height
–
м
аксимальная
высота
номера
.
_
Mode
определяет режимы детектирования
автомобильного номера. Их можно
,
даже нужно использовать
совместно. В данной версии режимов детектирования 4:
Они отличаются настройками при
поиске номеров и их можно
использовать одновременно (при этом правда несколько снижается
производительность).
–
МетодL основанный на детектировании
номера целиком с простой адаптивной обработкой изображения.
–
МетодL основ
анный на детектировании
номера целиком с адаптивной обработкой изображенияL основанной
на удалении мелких перемычек. Включает в себя практически 100%
номеров детектированных с помощью ANPR_DETECTMODE1L а также
номераL которые ANPR_DETECTMODE1 не детектирую
тся. Поэтому
ANPR_DETECTMODE1 не рекомендуется использовать.
–
МетодL основанный на детектировании
номера целиком с блочной обработкой изображения.
–
МетодL основанный на выделении
частей номера с простой адаптивной
обработкой изображения. Не
рекомендуется использовать отдельно от других методовL поскольку
дает низкие показатели детектированных номеров и не всегда точное
детектирование. ОднакоL его особенности таковыL что он детектирует
те номераL которые не детектиру
ются другими методами.
При этом
могут в значительном количестве возникать дополнительные
ложные срабатыванияL напримерL на плакатах.
Для качественного распознавания рекомендуется использовать
комбинации методов ANPR_DETECTMODER и ANPR_DETECTMODESL
10
или ANP
последнюю комбинацию методов можно
получить одним флагом
Определение
в
iANPR
.
h
:
0x01
0x02
0x04
#
define
ANPR
_
4
0
x
08
Максимальное
количество символов номера должн
о
совпадать с
максимальным размеромL заданным в Texts функции anprPlate.
Конечно максимальное количество
символов
+
символ
конца строки
(0)
равно 10L но если поставить больше
размер буфераL напримерL R0L
то это ошибкой не будет.
type_number
определяет тип номеров для
распознавания.
flags
определяет дополнительные режимы распознавания.
Нужно пока устанавливать 0L а если возникает необходимость
выводить номера даже с низкой дост
оверностью распознавания
отдельных символов (в том числе с символамиL замененными знаком
'?'
)L то установить
флаг
DEBUG_RECOGNITION_MODE
L который равен
1.
Флаг
NO_LOW_RELIABILITY
предназначен для снижения ложных
срабатыванийL при этом некоторые номера с низкой достоверностью
могут быть отброшены.
Флаг
_
TYPE
_
NUMBER
позволяет
выводить после
распознанного номера через двоеточие его тип. Например
X
111
XX
11:0
. В версии
1.6
опред
елены следующие
возвращ
аемые
тип
ы:
Российские номера
Тип номера
Код
Описание возвращаемого типа
TYPE_RUSSIAN_BASE
0
Базовый номер России
TYPE_RUSSIAN_TRANSIT
1
Транзитный номер России
TYPE_RUSSIAN_TRAILER
2
Номер прицепа России
TYPE_RUSSIAN_PUBLIC
3
Общественный транспорт России
TYPE_RUSSIAN_POLICE
4
Номер полиции России
TYPE_RUSSIAN_ARMY
5
Военный номер России
TYPE_RUSSIAN_SQUARE_BASE
6
Номер трактора или мотоцикла России
Номера Казахстана
Тип номера
Код
Описание возвращаемого типа
TYPE_KAZ_PRIVATE1993
21
Частные номера стандарта 199S года
TYPE_KAZ_ORGANIZATION1993
22
Номера организаций стандарта 199S
года
TYPE_KAZ_PRIVATE2012
23
Частные номера стандарта R01R года
TYPE_KAZ_ORGANIZATION2012
24
Номера организаций стандарта R01R
года
11
Номера
Республики Беларусь
Тип номера
Код
Описание возвращаемого типа
TYPE_BY_2004_BASE
30
Базовый номер стандарта R004 года
TYPE_BY_TRANSIT
31
Транзитные номера
стандарта
СТБ 914
-
99
(тип 1R и 1Rа в редакции R011 года)
TYPE_BY_2004_TRAILER
32
Номера
прицепов стандарта R004 года
TYPE_BY_PUBLIC
33
Номера
общественного транспорта
TYPE_BY_POLICE
34
Номера МВД
TYPE_BY_ARMY
35
Военные номера
TYPE_BY_SQUARE_BASE
36
Задние
базовые
двухстрочные
номера
стандарта
R004 года
TYPE_BY_2004_TRUCK
37
Номера г
рузовы
х автомобилей
и
автобус
ов стандарта
2004
года
TYPE_BY_1992_TRUCK
38
Номера грузовых автомобилей и
автобусов стандарта 199R года
Номера
Польши
Тип номера
Код
Описание возвращаемого типа
TYPE_PL_BASE
40
Базовы
е
номер
а
стандарта R00
0 и R006
года
Номера
Латвии
Тип номера
Код
Описание возвращаемого типа
TYPE_LV_BASE
5
0
Базовы
е
номер
а
стандарта
1992
и R00
4
года
Номера
Ли
тв
ы
Тип номера
Код
Описание возвращаемого типа
TYPE_LT_BASE
60
Базовы
е
номер
а
стандарта
2
004
года
Номера Эстонии
Тип номера
Код
Описание возвращаемого типа
TYPE_EST_BASE
7
0
Базовы
е
номер
а
стандарта
2004
года
Номера Украины
Тип номера
Код
Описание возвращаемого типа
TYPE_UA_BASE
8
0
Базовы
е
номер
а
стандарта
2
015
года
(легковые автомобилиL прицепыL
автобусы)
TYPE_UA_TRANSIT
81
Номера для разовых поездок на
автомобиляхL прицепах к ним и
автобусах стандарта R015 года
TYPE_UA_DIPLOMAT
82
Номера дипломатов и техперсонала
стандарта R01S года
Номера Молдовы
Тип номера
Код
Описание возвращаемого типа
TYPE_MD_2011_BASE
9
0
Номера
физических и юридических лиц
стандарта R011
-
2015
года
12
TYPE_MD_2011_TRAILER
9
1
Номера прицепов и полуприцепов
стандарта
2011
-
2015
года
TYPE_MD_2011_SQUARE_BASE
9
2
Номера мототехники стандарта R011
-
R015 года
Нужно помнитьL чтобы размеры буфера для текста
были
больше номера с возвращаемым типом.
Типы распознаваемых номеров
Типы распознавания Российских номеров
Тип номера
Код
Тип
изображения
Описание
поддерживаемых
номеров
ANPR_RUSSIAN_BASE
0
8bit, 1 chan
n
el
Базовые
ANPR_RUSSIAN_BASE2
1
8bit, 1 chan
n
el
Базовые и транзитные
ANPR_RUSSIAN_EXTENDED
2
8bit, 1 chan
n
el
БазовыеL транзитные и
номера прицепов
ANPR_RUSSIAN_PUBLIC
3
8bit, 1 chan
n
el
Только общественный
транспорт
ANPR_RUSSIAN_POLICE
5
8bit, 1 chan
n
el
Только номера полиции
ANPR_RUSSIAN_ARMY
6
8bit,
1 chan
n
el
Только военные номера
ANPR_RUSSIAN_EXTENDED2
4
8bit,
3
chan
n
el
ANPR_RUSSIAN_EXTENDED
+ ANPR_RUSSIAN_PUBLI
C
ANPR_RUSSIAN_FULL
7
8bit,
3
chan
n
el
ANPR_RUSSIAN_EXTENDED2
+ ANPR_RUSSIAN_POLICE +
ANPR_RUSSIAN_ARMY
ANPR_RUSSIAN_SQUARE_BASE
8
8bit, 1
chan
n
el
Только квадратные
номера
ANPR_RUSSIAN_FULL_WITH_SQUARE
9
8bit,
3
chan
n
el
ANPR_RUSSIAN_FULL +
ANPR_RUSSIAN_SQUARE_BAS
E
8bit, 1 chan
n
el
–
изображение
в градациях серого;
8bit, 3
chan
n
el
–
цветное изображение.
Базовые номера
[ГОСТ Р 505WW
-
93]:
Т
ранзитные российские номера (MM9W6MS4).
Н
омера прицепов:
13
Общественный транспорт
–
желтые номера формата MM111RR.
Номера полиции
–
синие номера формата M1111RR
.
Военные номера
–
черные номера формата
1111
MM
22
.
Квадратные номера мотоциклов и тракторов типа:
1111
MM22
Типы распознавания номеров Казахстана
Тип номера
Код
Тип
изображения
Описание поддерживаемых
номеров
ANPR_KAZ_1993_PRIVATE
100
8bit,
1 chan
n
el
Частные номер
а
стандарта 199S года
ANPR_KAZ_1993_ORGANIZATION
101
8bit,
1 chan
n
el
Номера
организаций
стандарта 199S года
ANPR_KAZ_2012_PRIVATE
102
8bit,
1 chan
n
el
Частные номер
а
стандарта R01R года
ANPR_KAZ_2012_ORGANIZATION
103
8bit,
1 chan
n
el
Номера организаций
стандарта R01R года
ANPR_KAZ_BASE
104
8bit,
1 chan
n
el
Частные и номера
организации
стандартов 199S и R01R
Типы распознавания номеров Туркменистана
Тип номера
Код
Тип
изображения
Описание
поддерживаемых
номеров
ANPR_TM_2009
201
8bit,
1 chan
n
el
Частные номера
стандарта R009 года
ANPR_TM_PRIVATE_BEFORE_2009
202
8bit,
1
chan
n
el
Частные номера
стандарта до R009
года
ANPR_TM_BASE
203
8bit,
1 chan
n
el
Все частные номера
Типы распознавания номеров
Республики Беларусь
Тип номера
Код
Тип
изображения
Описание
поддерживаемых номеров
ANPR_BY_TRUCK
300
8bit,
1 chan
n
el
Все
грузовые номера
ANPR_BY_2004_TRUCK
3
0
1
8bit,
1 chan
n
el
Грузовые номера
стандарта R004 года
ANPR_BY_1992_TRUCK
3
0
2
8bit,
Грузовые номер стандарта
14
1 chan
n
el
199R года
ANPR_BY_2004_TRAILER
303
8bit,
1 chan
n
el
Задний знак для прицепов
и полуприцепов с
2004
г
ода
ANPR_BY_2004_BASE
304
8bit,
1 chan
n
el
Легковые автомобилиL
начиная с R004
года
ANPR_BY_SQUARE_BASE
305
8bit,
1 chan
n
el
Задние двухстрочные
знакиL начиная с R004 года
ANPR_BY_2004_BASE2
306
8bit,
1 chan
n
el
ANPR_BY_2004_TRUCK
+
ANPR_BY_2004_BASE +
ANPR_BY_2004_TRAILER
ANPR_BY_TRANSIT
307
8bit,
1 chan
n
el
Транзитные номера
стандарта
СТБ 914
-
99
(тип 1R и 1Rа в редакции
R011 года)
ANPR_BY_PUBLIC
308
8bit,
1 chan
n
el
Общественный транспорт
ANPR_BY_POLICE
309
8bit,
1 chan
n
el
Номера МВД
ANPR_BY_FULL
310
8bit,
3 chan
n
el
ANPR_BY_2004_BASE2 +
ANPR_BY_TRANSIT +
ANPR_BY_PUBLIC +
ANPR_BY_POLICE
ANPR_BY_FULL_WITH_SQUARE
311
8bit,
3 chan
n
el
ANPR_BY_FULL +
ANPR_BY_SQUARE_BASE
ANPR_BY_2004_BASE3
312
8bit,
1 chan
n
el
ANPR_BY_2004_BASE2 +
ANPR_BY_TRANSIT
Типы распознавания номеров Польши
Тип номера
Код
Тип изображения
Описание
поддерживаемых
номеров
ANPR_PL_BASE
400
8bit, 1 chan
n
el
Стандартные номера Польши
ANPR_PL_BASE_7 +
ANPR_PL_BASE_8
ANPR_PL_BASE_7
401
8bit,
1 chan
n
el
Стандартные номера Польши W
символов
ANPR_PL_BASE_8
402
8bit, 1 chan
n
el
Стандартные номера Польши 8
символов
Типы распознавания номеров Латвии
Тип номера
Код
Тип изображения
Описание
поддерживаемых
номеров
ANPR_LV_BASE
500
8bit, 1 chan
n
el
Стандартные номера 199R и
R004 года
Типы распознавания номеров
Литвы
Тип номера
Код
Тип изображения
Описание
поддерживаемых
номеров
ANPR_L
T
_BASE
6
00
8bit, 1 chan
n
el
Стандартные номера с R004
года
15
Типы распознавания номеров
Эстонии
Тип номера
Код
Тип
изображения
Описание
поддерживаемых
номеров
ANPR_EST_BASE
700
8bit, 1 chan
n
el
Стандартные номера R004 года
Типы распознавания номеров
Украины
Тип номера
Код
Тип изображения
Описание
поддерживаемых
номеров
ANPR_UA_BASE
800
8bit, 1 chan
n
el
Стандартные
номера R015 года
(автомобилиL прицепыL
автобусы)
ANPR_UA_TRANSIT
801
8bit, 1 chan
n
el
Номера для разовых поездок на
автомобиляхL прицепах к ним и
автобусахL R015 год
ANPR_UA_DIPLOMAT
802
8bit, 1 chan
n
el
Номера дипломатов и
техперсоналаL
R01S год
ANPR_UA_BASE2
803
8bit, 1 chan
n
el
ANPR_UA_BASE +
ANPR_UA_DIPLOMAT
ANPR_UA_BASE3
804
8bit, 1 chan
n
el
ANPR_UA_BASE2 +
ANPR_UA_TRANSIT
Типы распознавания номеров Молдовы
Тип номера
Код
Тип
изобра
жения
Описание
поддерживаемых
номеров
ANPR_MD_2011_BASE
900
8bit,
1
chan
n
el
Номера физических и
юридических лиц R011
-
2015
года + номера такси
ANPR_MD_2011_TRAILER
901
8bit,
1
chan
n
el
Номера прицепов и
полуприцепов R011
-
R015 года
ANPR_MD_2011_SQUARE_BASE
902
8bit,
1
chan
n
el
Номера мототехники R011
-
R015 года
ANPR_MD_2011_BASE2
903
8bit,
1
chan
n
el
ANPR_MD_2011_BASE +
ANPR_MD_2011_TRAILER
ANPR_MD_2011_FULL_WITH_SQ
UARE
911
8bit,
3
chan
n
el
ANPR_MD_2011_BASE2 +
ANPR_MD_2011_SQUARE_BA
SE
Тип
ANPR
_
CUSTOM
_
TYPE
Данный
тип
является
настраиваемы
м
типом
пользователя
и
имеет
значение
-
1.
При этом поле
custom
в
структуре
должно быть
заполнено.
Для всех остальных типов распознаванияL поле пустое.
Изображение на вход может подаваться как полноцветноеL так и
серое.
16
Настраиваемый тип определяется в
iANPRCustom.h
следующим
образом:
const int max_ianpr_custom_in_types = 20;
struct iANPRCustomElement
{
int all_types;
float probability; //
Вероятность
страны
int types[max_ianpr_custom_in_types];//
Типы
берутся
в
iANPR
float probability_types[max_ianpr_custom_in_types]; //
Вероятность
каждого
типа
,
можно
не
заполнять
};
struct iANPRCustom
{
int all_countries;
iANPRCustomElement
*
Elements
;
int flags; //
По
умолчанию
0
};
В текущей версии вероятность каждого типа не работает.
Вероятность страны по сути не вероятностьL а значимость. Т.е.
полученная вероятность номера умножается на значение значимости.
ВозьмемL напримерL Оренбургскую областьL где попадаются номера
из Казахста
на довольно часто. Определим уровень значимости для
России
1.2
L а для Казахстана 1. Тогда если идентифицировался номер
из РоссииL тогда его вероятность будет умножена на
1.
R. Если в тоже
время определился номер из КазахстанаL то его вероятность будет
умнож
ена на 1. Т.е. номер из России значимее из Казахстана. Можно
считать это некоторой формой априорной вероятности.
Если вы пишите программу на языке
C
/
C
++
L то можете заполнить
структуру самостоятельноL напримерL так:
iANPRCustom
* custom =
NULL
;
custom =
new
iANPRCustom
;
custom
-
all_countries = 2;
custom
-
Elements =
new
iANPRCustomElement
[2];
custom
-
Elements[0].all_types = 5;
custom
-
Elements[0].probability =
1
.
2
f;
custom
-
Elements[0].types[0] =
CUSTOM_RUSSIAN_BASE_EXTENDED
;
custom
-
Elements[0].types[1] =
CUSTOM_RUSSIAN_PUBLIC
;
custom
-
Elements[0].types[2] =
CUSTOM_RUSSIAN_POLICE
;
custom
-
Elements[0].types[3] =
CUSTOM_RUSSIAN_ARMY
;
custom
-
Elements[0].types[4] =
CUSTOM_RUSSIAN_SQUARE
;
custom
-
Elements[1].all_types = 1;
custom
-
Elements[1].probability =
1.0f;
custom
-
Elements[1].types[0] =
CUSTOM_KAZ_2012_PRIVATE
;
Однако в этом случае нужно помнитьL что удалить выделенные
элементы вы должны самостоятельно. Для других языков
программирования можно использовать функции создания и удаления
из
iANPRCustom.h
:
17
void*
CreateiANPRCustom(char* xml_buffer, int buffer_size)
;
void
(
void
*
xml
);
Пример
xml
файлаL в котором записана информацияL указанная в
коде вышеL здесь:
?xml; ver;sion;="1.;"?0;?xml version="1.0"?
oun;trie;s va;lue=;"2"0;countries value="2"
country all_types="5" probability="
1.2
" comment="First
country
-
Russia"
type; val;ue=";"/0;type value="2"/
type; val;ue=";"/0;type value="3"/
type; val;ue=";"/0;type value="5"/
type; val;ue=";"/0;type value="6"/
type; val;ue=";"/0;type value="8"/
/cou;ntry;/country
country all_types="1" probability="1" comment="Second
country
-
Kazakhstan"
type; val;ue=";Ă";/000;type value="102"/
/cou;ntry;/country
/cou;ntri;s00;/countries
Флаги в структуре
iANPRCustom
предназначены для
дополнительных возможностей. На настоящий момент поддержан
только один флаг
FLAG_CUSTOM_MULTI_RESULT
L который
позволяет возвращать не один наиболее вероятный номерL а
обнаруженные вероятные номера не более S. Причем первый номер
наиболее
вероятен. Возвращаемые номера находятся в той же
текстовой строкеL поэтому ее необходимо сделать большего размера
(не менее 40 байт)L номера будут возвращены в следующем виде:
Номер 1
|
Номер R
|
Номер S
Для прописывание флага в
xml
L нужно изменить строку с
к
оличеством стран так:
oun;trie;s va;lue=;"2" ;mult;i="1;"000;countries value="2" multi="1"
Поворот входного изображения
(
alpha
,
,
gamma
)
iANPR
SDK
предполагает
: если
автомобильный номер на
изображении повёрнутL то на малый угол (подробнее в разделе
требований
к алгоритму распознавания).
Для корректировки
значительного угла наклона можно использовать параметры
alpha
,
,
gamma
из
IANPR
_
OPTIONS
.
Alpha
задаёт по
ворот вокруг оси X
,
b
задаёт п
оворот вокруг оси Y
,
gamma
задаёт п
оворот вокруг оси Z
.
Значение 90
.0 означает отсутствие поворота
.
Для определения углов
поворота вдоль осей воспользуйтесь утилитой
persptrans
L которую
можно найти в составе iANPR SDK.
anprPlateRect
18
Функция поиска автомобильных номеров на регионе
изображения формата OpenCV.
int anprPlateRect(
IplImage* Image,
CvRect Rect,
ANPR_OPTIONS Options,
int* AllNumber,
CvRect* Rects,
char** Texts,
void* param = NULL
);
Параметры аналогичны функции
anprPlate
L дополнительный
параметр
Rect
определяет обрабатываемую на изображении область.
Возвращаемы
е значения такие жеL но добавляе
тся
ошибка
:
ERROR_RECT
(
-
1)
–
неправильно заданная область.
LicenseValue
Функция
активации лицензионной
версии
iANPR
.
Вызов этой
функции необходим только для лицензионной версии библиотеки и
только один раз перед первым распознаванием.
В случае
использования функции
LicenseValue
с демо
-
версией
iANPR
L она
никак
не повлияет на работу программы.
void LicenseValue(
char* lic
);
Параметры
:
lic
–
массивL содержащий лицензионный ключ.
Функция не возвращает значений.
1.2.
Модуль интерфеи сов
–
iA.0Rinterface
Модуль интерфейсов расширяет возможности подключения к
библиотеке.
Определения функций представлены в
iANPRinterface.h
.
19
anprPlateMemory
Функция предназначена для распознавания графического файла
форматов BMPL JPEGL PNGL TIFF форматовL который находится в
памяти. К примеруL с жесткого диска в память читается BMP файлL а
функции передается указатель на
него.
i
nt
anprPlateMemory(
char* in_buffer,
int size_buffer,
ANPR_OPTIONS Options,
int* AllNumber,
CvRect* Rects,
char** Texts
);
Параметры:
in
_
buffer
–
указатель на входное изображение;
size
_
buffer
–
размер буфера изображения;
Остальные параметры аналогичны функции
anprPlate
.
Возвращаемые значения такие жеL как и в
anprPlate
.
anprPlateMemoryRect
Назначение
функции
аналогично
anprPlateMemory
L только также
как и в
anprPlateRect
добавляется область поиска.
int anprPlateMemoryRect(
char* in_buffer,
int size_buffer,
CvRect Rect,
ANPR_OPTIONS Options,
int* AllNumber,
CvRect
*
Rects
,
char
**
Texts
);
Назначение
параметров
и
возвращаемых
значений
аналогично
anprPlateMemory
и
anprPlateRect
.
anprPlateMat
20
Функция аналогичная
anprPlate
L за исключением тогоL что
первый параметр
–
это изображение в формате
cv
::
Mat
C
++
интерфейса изображений в
OpenCV
.
int anprPlateMat(
cv::Mat Image,
ANPR_OPTIONS Options,
int* AllNumber,
CvRect
*
Rects
,
char
**
Texts
);
Назначение параметров и возвращаемых значений аналогично
anprPlate
.
anprPlateMatRect
Назначение функции аналогично
anprPlateMat
L только также как
и в
anprPlateRect
добавляется область поиска.
int anprPlateMatRect(
cv::Mat Image,
CvRect Rect,
ANPR_OPTIONS Options,
int* AllNumber,
CvRect* Rects,
char** Texts
);
Назначение параметров и возвращаемых значений аналогично
anprPlate
.
anprPlateXML
ФункцияL аналогичная
anprPlate
L за исключением тогоL что
найденные номера возвращаются в формате XML.
int anprPlateXML(
IplImage* Image,
ANPR_OPTIONS Options,
char* xml_buffer,
int* size_xml_buffer
);
Параметры:
21
Image
–
входное изображе
ние в формате OpenCV (8
-
битное
1
-
канальное
или 8
-
битное S
-
канальное
в зависимости от параметров
Options.
type_number);
Options
–
настройки режима распознавания
в формате структуры
ANPR_OPTIONS
;
xml
_
buffer
–
указатель
на выделенный в памяти перед вызовом
функции буферL в который будет возвращаться XML
-
строка
следующего формата:
?xml version="1.0" encoding="windows
-
1251"?
¬ti;on_r;sul;t ve;rsio;n='1;.0'0;action_result version='1.0'
lln;umbe;rs v; lue;='1';allnumbers value='1'
numb;r v; lue;='M9;vMM;Ĵ'; coo;rd=';Ƀ,;ɖ,;ŷ,;S'0;number value='M976MM134' coord='243,256,177,53'
/
number
/
allnumbers
/
action
_
result
allnumbers
показывает количество найденных автомобильных
номеров.
А для каждого найденного номера возвращается тег numberL
у которого v
a
lue
–
текст
номераL а coord
–
его координаты (XLYLширинаL
высота).
size_xml_buffer
–
размер выделенного буфераL после вызова
функции будет содержать размер записанной XML
-
строки/
Возвращаемые значения такие жеL как и в
anprPlate
,
добавляется возможная ошибка:
ERROR_SIZE_XML_BUF
(
-
S) Недостаточный размер буфера
XML.
anprPlateRectXML
,
anprPlateMemoryXML
,
anprPlateMemoryRectXML
,
anprPlateMatXML
,
anprPlateMatRectXML
Варианты предыдущих функций с возвращением параметров
через XML.
int anprPlateRectXML(
IplImage* Image,
CvRect Rect,
ANPR_OPTIONS Options,
char* xml_buffer,
int* size_xml_buffer
);
int anprPlateMemoryXML(
char* in_buffer,
22
int size_buffer,
ANPR_OPTIONS Options,
char* xml_buffer,
int* size_xml_buffer
);
int
anprPlateMemoryRectXML(
char* in_buffer,
int size_buffer,
CvRect Rect,
ANPR_OPTIONS Options,
char* xml_buffer,
int* size_xml_buffer
);
int anprPlateMatXML(
cv::Mat Image,
ANPR_OPTIONS Options,
char* xml_buffer,
int* size_xml_buffer
);
int anprPlateMatRectXML(
cv::Mat Image,
CvRect Rect,
ANPR_OPTIONS Options,
char* xml_buffer,
int
*
size
_
xml
_
buffer
);
Параметры и возвращаемые значения аналогично
вышеописанным функциям.
1.3.
Потоковыи модуль
-
iA.0Rcapture
Потоковый модуль
предназначен для повышени
я
достоверности
распознавания автомобильных номеров
на видеопотоке за счет
объединения результатов распознавания из нескольких кадров.
Функции данного модуля определены в
iANPRcapture.h
.
ВНИМАНИЕA Мультитип (несколько номеров для
ANPR_CUSTOM_TYPE) на настоящий момент нельзя использовать.
23
CreateiANPRCapture
Создание
iANPR
-
потока
.
iANPRCapture CreateiANPRCapture(
int max_frames,
ANPR_OPTIONS Options,
CvRect
Rect
);
Параметры
:
max
_
frames
–
количество кадровL из которых объединяется
результат;
Options
–
настройки распознавания (заполненная структура
ANPR_OPTIONS
);
Rect
–
область распознавания в формате CvRect.
Возвращает выделенный в памяти объект
iANPRCapt
ure
. Если
создать не удастсяL то возвращает NULL.
ReleaseiANPRCapture
Очистка памяти от объекта
iANPRCapture
.
void ReleaseiANPRCapture(
iANPRCapture *Capture
);
Параметры
:
Capture
–
указатель на объект
iANPRCapture
.
Функция добавляет текущий кадр в поток
iANPRCapture
и
возвращает распознанные автомобильные номер
а
.
iANPRCapture Capture,
IplImage* Image,
int* AllNumber,
CvRect* Rects,
char** Texts
);
Параметры:
24
Capture
–
объект
iANPRCapture
.
Image
–
входное изображение.
Остал
ьные параметры аналогичны
anprPlate
.
Возвращаемые значения аналогичны
anprPlate
.
Функция добавляет текущий кадр (
cv
::
Mat
)
в поток iANPRCapture
и возвращает распознанные автомобильные номера.
iANPRCapture Capture,
cv::Mat Mat,
int* AllNumber,
CvRect
*
Rects
,
char
**
Texts
);
Параметры аналогичны
за тем
исключениемL что текущий кадр передаётся в структуре
cv
::
Mat
.
Возвращаемые значения аналогичны
anprPlate
.
CreateMemoryForiANPRCapture
Функция выделяет память для дополнительной
функциональности потокового распознавания. Необходимо вызывать
только если предполагается использование далее функции
.
int
CreateMemoryForiANPRCapture
(
iANPRCapture
Capture
,
int
min
_
frames
_
with
_
plate
,
int frames_without_plate,
int max_plates_in_mem
);
Параметры
:
Capture
–
объект
iANPRCapture
.
min
_
frames
_
with
_
plate
–
количество кадров между первым и
последним распознанным номеромL после которого можно считатьL
что это действительно номер
.
frames
_
without
_
plate
–
количество кадров без распознанного ранее
номераL после которого можно выдавать результат
.
max
_
plates
_
in
_
m
em
–
максимальное количество
номеров в па
мяти
.
Ф
ункция возвращает 0 при успешном вызовеL иначе ошибка.
25
Возвращает суммированный результат нахождения номера из
памяти. Он возвращается только после frames_without_plate кадров
,
установленных в
CreateMemoryForiANPRCapture
.
iANPRCapture Capture,
int* AllNumber,
char** Texts,
int Size_Texts,
CvPoint* Points,
int* all_point
);
Параметры:
Capture
–
объект
iANPRCapture
.
AllNumber
–
возвращается количество распознанных номеров на
последний кадр из памяти
(первоначально содержит размер буфера
(количество номеров)
Texts
)
.
Texts
–
содерж
имое номера.
Size_Texts
–
размер каждого
элемента (строки)
массива
Texts
.
Points
–
указатель на выделенный п
е
ред вызовом массив CvPoint для
траектории (если NULLL то
траектория не возвращается).
all_points
–
сюда передается размер массива
Points
L возвращается
количество найденных точекL
а
если массив меньше (рекомендуется
1000 э
лементов)L чем
реально найдено точекL то будет возвращено
только то количество точекL для которых есть место.
Функция возвращает 0 при успешном вызовеL иначе ошибка.
Если возвращаются одновременно R номера в кадреL что
маловероятноL по причине суммирования
и отсрочкиL то будет
возвращатьс
я
траектория только для первого.
CreateLineIntersection
Функция создает линию для фиксации пересечения. На самом
деле линия состоит из двух линий
–
и пересечение фиксируется
только тогдаL когда пересекаются обе (сделано
для исключения
ложных
срабатываний
)
.
int
CreateLineIntersection(
iANPRCapture Capture,
CvPoint p1a,
CvPoint p2a,
CvPoint p1b,
CvPoint p2b
26
);
Параметры
:
Capture
–
объект
iANPRCapture
.
p1a
и
p2a
–
точки характеризующие верхнюю линию (линия не может
быть вертикальной
–
максимум
дельта x может быть в S раза меньше
дельта y.
Иначе ошибка ERROR_SLOPE_LINE).
p1b
и
p2b
–
точки характеризующие нижнюю линию.
Функция возвращает 0 при успешном вызовеL иначе
ошибка.
Линии должны быть параллельны друг другу. Иначе
ERROR
_
NO
_
PARALLEL
_
LINES
.
LicenseCapture
Функция активации лицензионной версии
iANPR
capture
.
Вызов
этой функции необходим только для лицензионной версии библиотеки
и только один раз перед первым распознаванием. В случае
использования функции
LicenseCapture
с демо
-
версией
iANPRcapture
,
она никак
не повлияет на работу программы.
void License
Capture
(
char* lic
);
Параметры
:
lic
–
массивL содержащий лицензионный ключ.
Функция не возвращает значений.
27
2. Инсталляция и использование
Каких
-
либо особых требований к инсталляции не существует.
2.1. Windows
Для тогоL чтобы iANPR SDK
заработалоL на компьютер
необходимо установить:
Для
Microsoft Visual C++ 2013 SP1 Redistributable Package (x86)
http://www.microsoft.com/en
-
us/download/details.aspx?id=40784
Скачайте OpenCV R.4.1S
-
win/2.4.13/opencv
-
2.4.13.exe/download
Хотя нужные библиоте
ки
OpenCV
идут вместе с
iANPR
SDK
L но
для разработки программ вам вероятно понадобится подключение
заголовочных файлов. В
i
ANPR использовались библиотекиL
откомпилированные
v
с1R.
Далее осуществляете подключение в виде обычных
динамических библиотек.
Есл
и вы реализуете проект на C/C++ на Visual StudioL то
пропишите пути до h и lib для OpenCV и местаL где находится iANPR:
28
Добавьте подключаемые библиотеки (в свойствах
Компоновщика):
После этого обратите вниманиеL чтобы все dll из папки x86 или
x64 на
ходились или в папке с вашим исполняемым файломL или в
папкеL прописанной в переменной PATH.
2.2. Linux
Использованная ОС
–
Ubuntu
16.04
desktop
i
386
1. Руководствуясь
http
://
docs
.
opencv
.
org
/
doc
/
tutorials
/
introduction
/
linux
_
install
/
linux
_
inst
all
.
html
устанавливаем дополнительное программное обеспечение для
OpenCV
.
R. Скачиваем версию
OpenCV
R.4.1S для
linux
отсюда
http
://
sourceforge
.
/
projects
/
opencvlibrary
/
И компилируем ее.
S. Скачиваем и распаковываем
iANPR
SDK
4. Необходимо сделать видимой библиот
еку для программ. Для
этого можно прописать путь до
libianpr
_86.
so
или просто скопировать
этот файл туда жеL где лежат библиотеки
OpenCV
:
/
usr
/
local
/
lib
/
2
9
5. Обновить пути до библиотек
ldconfig
6. В папке с примером для
L
inux открываем
makefile
и
исправл
яем
lianpr
_64 на
lianpr
_86 (поскольку компилируем в SR битной
версии
linux
).
W. В той же папке вызываем
make
Должен создаться исполняемый файл.
8. Проверяем работу программы.
30
3. Примеры
на
C/C++
для
Windows
3.1.
)mage
Исходный код примеров постоянно совершенствуется. В
описании ниже отражены наиболее значимые участки кода. Однако
полный исходный код примеров может отличаться. Полный исходный
код примера
image
находится в папке
samples
L распространяемой с
iANPR
SDK
.
#i
nclude
"opencv2/highgui/highgui_c.h"
#include
"../../Include/iANPR.h"
#include
stdio.h-6s6;t-6d;i-6;o6.-;h-6;
#include
Windows.h-6W6;i-6n;m-6;o6w-;s-6;.6h-;怀
int
main
(
int
argc
,
char
**
argv
)
{
IplImage
* Img = 0;
IplImage
* grayImg = 0;
// filter input
if
(
argc
2)
{
printf
(
"Too few
arguments. For help print %s /?"
,
argv
[0]);
return
-
1;
}
else
if
(!
strcmp
(
argv
[1],
"help"
) || !
strcmp
(
argv
[1],
"
-
help"
) || !
strcmp
(
argv
[1],
"
--
help"
) || !
strcmp
(
argv
[1],
"/?"
))
{
printHelp
(
argv
[0]);
return
0;
}
else
if
(
argc
3)
{
printf
(
"Too few arguments. For help print %s /?"
,
argv
[0]);
return
-
2;
}
else
// argc = 3
Img =
cvLoadImage
(
argv
[2],
CV_LOAD_IMAGE_COLOR
);
if
(!Img)
{
printf
(
"Can't load file!
\
n"
);
return
-
4;
}
CvRect
Rects
[100];
int
all
= 100;
char
**
res
=
new
char
*[
all
];
for
(
int
j
=0;
j
all
;
j
++)
res
[
j
] =
new
char
[20];
ANPR_OPTIONS
a
;
a
.
Detect_Mode
=
ANPR_DETECTCOMPLEXMODE
;
31
a
.
min_plate_size
= 500;
a
.
max_plate_size
= 50000;
a
.
max_text_size
= 20;
a
.
type_number
=
atoi
(
argv
[1]);
a
.
flags
= 0;
a
.
max_threads
= 1;
bool
isFullType =
false
;
for
(
size_t
i
= 0;
i
anprFullTypesCount
;
i
++)
if
(
anprFullTypes
[
i
] ==
a
.
type_number
)
isFullType =
true
;
// Вызов LicenseCapture необходим только для платных версий
// И только один раз, перед
первым распознаванием.
char
*
key
=
new
char
[8001];
memset
(
key
, 0, 8001);
FILE
*
f
=
fopen
(
"lic.key"
,
"rb"
);
if
(
f
!=
NULL
)
{
fread
((
void
*)
key
, 8000, 1,
f
);
fclose
(
f
);
}
else
puts
(
"WARNING! File lic.key not found. This may crash program if you
use
license version of iANPR SDK dlls"
);
LicenseValue
(
key
);
delete
[]
key
;
key
= 0;
int
i
=
-
9999;
if
(isFullType)
i
=
anprPlate
( Img,
a
, &
all
,
Rects
,
res
);
else
{
grayImg =
cvCreateImage
(
cvGetSize
(Img), 8, 1);
cvCvtColor
(Img, grayImg,
CV_BGR2GRAY
);
i
=
anprPlate
( grayImg,
a
, &
all
,
Rects
,
res
);
}
if
(
i
== 0 )
for
(
int
j
= 0;
j
all
;
j
++ )
{
printf
(
"%s
\
n"
,
res
[
j
] );
}
else
printf
(
"Error:%d
\
n"
,
i
);
for
(
int
j
=0;
j
100;
j
++)
delete
[]
res
[
j
];
delete
[]
res
;
cvReleaseImage
( &Img );
cvReleaseImage
( &grayImg );
return
0;
}
В примере загружается изображение с помощью функции
cvLoadImage. Далее выделяется память для хранения 100 номеров
(предполагаемL что будут найдено не более 100 номеровL
конечноL
можно устанавливать меньше).
Заполняется структура
ANPR_OPTIONS
L при заполнении
указывается режим детектирования дорожных знаков
. Устанавливается диапазон площади
32
(в пикселях в квадрате) номер
ов
L 1 поток для распознавания.
Значение R0 соответствует определенным выше буферам для
хранения номеров.
Тип детектирования номера установлен базовымL
что означаетL что при попадании в кадрL к примеруL номеров прицепаL
они могут распознаваться неправильно.
Считывается лицензионный ключ из файла
lic
.
key
с помощью
функции
fread
L а затем ключ передаётся в функцию
LicenseValue
.
Вызов этой функции необходим только для лицензионной версии
iANPR
SDK
и только перед первым распознаванием.
Вызывается функция
anprPlate
из iANPR SDK. После чего
найденные номера в кадре изображения выводятся в консоль.
В конце осуществляется уничтожение ранее выделенной памяти.
Пример вызова
(для текущей версии
–
отличается от примера
выше
)
:
image
.
exe
0
..
\
images
\
image
.
bmp
Информация выведется на консольL в файл:
image.exe
0
..
\
images
\
image.bmp res.txt
3.2.
)mage
_
new
В данном примере показаноL как пользоваться различными
интерфейсами для работы с библиотекой.
В отличи
е
от предыдущего
примера
подключается
дополнительный
заголовочный файл
iANPRinterface.h
.
Функция Memory в примере показывает возможность чтения
JPEGL BMPL PNGL TIFF файлов из памяти. Т.е. можно прочитать файл
в памятьL а потом передать указатель в
anprPlateMemory
.
В функции
WithMat
приведен
C
++ инт
ерфейс доступа на основе
Mat. Изображение распознается через функцию
anprPlateMatRect
.
В функциях
XMLWork
и
XMLWork
R приведены примеры работы с
функциями
anprPlateRectXML
и
anprPlateMatRectXML
соответственно. Результат в виде XML
-
строки выводится в консоль.
3.3.
)mage
_
omp
В версии
iANPR
1.6 по
явилось встроенное распараллеливание.
Этот пример может быть использован для сравнения результатов
работы. В этом примере распараллеливание достигается за счёт
разбиения входного изображения на отдельные части.
33
К
огда производится работа с большими
изображениямиL
напримерL 19R0x1080L время распознавания на обычном ПК может
быть недостаточно для работы в реальном времени. Для решения
данной проблемы можно разбить изображение на части и
анализировать их параллельно. ЗдесьL однакоL следует помнитьL что
в
случае попадания номера на пересечение частейL то он не будет
распознан. Поэтому нужно внести некоторую избыточностьL используя
пересекающиеся части. Причем уровень пересечения определяется
максимально возможными размерами объекта распознавания.
Предполо
жимL что объект распознавания в форме кругаL и его
максимальный диаметр на изображении составляет
D
max
. Тогда
ширина области пересечения сегментов должна быть больше
D
max
. В
этом случае площадь несколько раз анализируемой области (в разных
сегментах) будет
рассчитываться по следующей формуле:
S
=
L
*
D
max
,
где
L
–
длина границ между всеми сегментами. ПонятноL что в
этом случае
S
будет зависеть не только от количества сегментовL но и
от их формы. На
следующем
рисунке показано два примера
расположения сегмент
ов. Один сегмент серого цветаL а другой белого.
Область пересечения показана штрихами.
(а)
(б)
Декомпозиция с пересекающимися границами: с небольшой областью
пересечения (а)L со значительной
областью пересечения (б)
Недостатком является тоL что при полном анализе изображения
будет анализироваться не Width*Height площадь изображенияL а
Width*Height+S.
ПредположимL что мы знаем количество ядер процессораL
напримерL 6. Разделим изображение на 6
частей так:
34
Естественно нужно помнить об области пересечения частей.
1080/6 = 180
Возьмем в качестве максимальной высоты номера высоту в 80
пикселей. Тогда части вверх и вниз увеличатся на 40 пикселейL кроме
самого верхнего и нижнегоL где увеличение
только в одну сторону.
В примере распараллеливание происходило на основе
библиотеки OpenMP.
Для каждого потока создавалось собственное изображениеL
после чего запускался параллельный цикл:
#pragma
omp parallel
{
#pragma
omp
for
for
( i = 0; i max;
i++ )
{
CvRect Rects[100];
int
all = 100;
char
** res =
new
char
*[all];
for
(
int
j=0;jall;j++) res[j] =
new
char
[20];
ANPR_OPTIONS a;
a.Detect_Mode = ANPR_DETECTCOMPLEXMODE;
a.min_plate_size = 500;
a.max_plate_size = 50000
;
a.max_text_size = 20;
a.type_number = ANPR_RUSSIAN_BASE;
a.flags = 0;
int
i2 = anprPlate( Images[i], a, &all, Rects, res );
if
( i2 == 0 )
for
(
int
j = 0; j all; j++ ) {
#pragma
omp critical
{
printf(
"%s
\
n"
, res[j] );
}
}
for
(
int
j=0;j100;j++)
delete
[] res[j];
delete
[] res;
}
}
Первоначально сравним насколько велика избыточностьL
откомпилировав программу с выключенным OpenMP. Успешное
35
распознавание было в обоих случаях. В
ремя распознавания
на
AMD
-
FX(tm)
-
6100 Six
-
cores S.SGHz (на одном ядре)L 8Гб ОЗУL Windows W 64:
Последовательный блок 0.R9Wс
Параллельный блок 0.S69с
Т.е. избыточность вычислений примерно в 1.R4 раз. Во столько
замедлилось вычисление.
После включения OpenM
P параллельный блок отработал за
0.1с. Т.е. прирост производительности в R.9 раз.
Почему такой малый прирост?
Ответ:
1) избыточность; R)
вычисления в блоках неравномерные
–
где обнаружился номерL а где
нет
L поэтому время работы
–
это время распознавания бл
ока с
максимальной информацией.
Но в принципеL даже такой прирост производительности
–
почти
в S раза. А это позволяет за 1 секунду обработать 10 кадровL что для
реального времени может быть достаточно
при данных настройках
.
3.4.
Capture
Пример Capture
работает с Web
-
камеройL но если в качестве
аргумента командной строки указать видео файлL то будет
обрабатывать его. Информация о распознавании выводится прямо в
кадр следующим образом:
Особенностью данного примера потокового распознавания
номера являе
тся тоL что выдается результат распознавания не
каждого кадраL а производится проверка
–
есть ли в предыдущем
36
кадре такой же найденный номер. Если естьL то только тогда
выводится результат распознавания.
Данный подход позволяет отбросить значительную част
ь ложных
срабатыванийL возникающих в отдельном кадре.
3.5.
C
apture
_(
iA.0Rcapture
)
Данны
й
пример показываетL как работать с модулем
iAN
Rcapture
.
Данный модуль позволяет добиться более высокой
достоверности распознаванияL чем в примере CaptureL по причине
тогоL что проверяется не совпадение номеров в обоих кадрахL а
вычисляется общая достоверность распознанных символов в кадре с
уровнем глубины (кол
ичества
кадров)L заданным программистом:
i_capture = CreateiANPRCapture( 10, a, cvRect( 0, 0, frame
-
width, frame
-
height ) );
Каждый кадр добавляется в потоковый объект
i1 = AddFrameToiANPRCapture( i_capture, object, &all, Rects, res );
Где
вытесняется старый кадр и проверяется
–
не было ли
похожего номера на предыдущих кадрах. Если номерL найденный в
текущем кадре похож на номера в одном или нескольких предыдущихL
то результаты распознавания суммируются.
3.6.
(iA.0Rcapture_motion)
Данный пр
имер является улучшение предыдущего.
Позволяет
вычислять траекторию движения номера и детектировать
пересечение линииL т.е. можно реализовать функционал
детектирования въезда
-
выезда авто.
Отличие данного примера в следующем.
Первоначально создается дополн
ительная память для
дополнительной функциональности (удалять ее потом не надоL она
очистится вместе с удалением объекта).
CreateMemoryForiANPRCapture
(
i
_
capture
, 10, 15, 100 );
Максимальное
количество номеров в памяти
–
100. Если 15
кадров не было
номераL распознанного ранееL то выдается результат.
Номер считается распознаннымL только если его начальное
детектирование было раньшеL чем 10 кадров в конечном.
37
Далее
создается
линия
пересечения
:
Lines[0].x =
int
( frame
-
width * 0.1f ); Lines[0].y =
int
(
frame
-
height * 0.6f );
Lines[1].x =
int
( frame
-
width * 0.3f ); Lines[1].y =
int
( frame
-
height * 0.6f );
Lines[2].x =
int
( frame
-
width * 0.1f ); Lines[2].y =
int
( frame
-
height * 0.7f );
Lines[3].x =
int
( frame
-
width * 0.3f ); Lines[3].y =
int
( frame
-
height * 0.7f );
CreateLineIntersection( i_capture, Lines[0], Lines[1], Lines[2], Lines[3] );
Для получения такого уточненного результата нужно каждый раз
(в каждом кадреL после вызова функции
AddFrameToiANPRCapture
вызывать функциюL возвращающую траекторию:
GetNumbersInMemory( i_capture, &all, res , 20, Points, &all_points );
Если значение
all
_
points
будет больше 0L то значит номер
нашелся. И на экран выводится траектория номера и сам номер:
for
(
int
j
= 0;
j
all
_
points
;
j
++ )
{
cvCircle( frame, Points[j], 5, CV_RGB(0,0,255), 3 );
if
( j 0 ) cvLine( frame, Points[j], Points[j
-
1], CV_RGB(0,0,255), 2 );
}
CvFont font;
float
aa=0.001f*frame
-
width;
cvInitFont( &font, CV_FONT_HERSHEY_SIMPLEX, aa,
aa,0,1, 8 );
CvSize size;
int
b;
cvGetTextSize( res[0], &font, &size, &b );
cvRectangle( frame, cvPoint(0, 0 ), cvPoint( size.width + 2,
50 ), CV_RGB( 255, 255, 255 ), CV_FILLED );
CvPoint pp2,pp1;
pp2.x=0;
pp2.y=40;
pp1.x=1;
pp1.y=41;
cvPutText(
frame, res[0], pp1, &font, CV_RGB(0,0,0) );
cvPutText( frame, res[0], pp2, &font, CV_RGB(0,255,0) );
cvResize( frame, image );
cvShowImage(
"frame"
, image);
3.7.
0ersptrans
Утилита
persptrans
предназначена для
устран
ения
поворот
а
автомобильного номера
на исходном изображении. Угол поворота
за
даётся
в структуре
ANPR_OPTIONS
c
помощью параметров alphaL
. Угол alpha задаёт поворот вокруг оси ХL угол beta
–
вокруг оси
Y
L угол gamma
–
вокруг оси
Z
.
Текущие значения
параметров alphaL
beta
и
gamma
выводятся в стандартный поток
38
вывода (консоль). Полученные значения могут быть использованы в
структуре
ANPR
_
OPTIONS
L передаваемой в одну из функций
распознаванияL например в
anprPlate
.
Для управления программой используются следующие клавиши:
w
,
s
–
поворот вокруг оси
X
;
a
,
d
–
поворот вокруг оси
Y
;
q
,
e
–
поворот вокруг оси
Z
;
r
–
выключить/включить распознавание;
g
–
показать/скрыть сетку;
v
,
b
–
увеличить / уменьшить количество клеток се
тки;
esc (escape)
–
выход.
Нажимать управляющие клавиши необходимо в окне
«
Transformed
».
Поворачивайте изображение до тех порL пока не
достигните требуемый результат
в распознавании
.
Как правилоL
наилучшее распознавание происходитL если грани автомобильного
номера (или хотя бы нижняя грань) параллельны сетке.
ПомнитеL что
иногда меньший поворот лучше большего.
Пример использования:
persptrans
.
exe
image
.
bmp
0
В данном примере использ
ования
для поворота будет загружено
изображение
image
.
bmp
L распознаваться
будут
базовые российские
номера
(
ANPR_RUSSIAN_BASE
L то есть тип 0
).
39
4. Примеры на других языках для
Windows
4.1.
C
#
На CC рекомендуется использовать XML интерфейс для работы
с библиотекой.
В библиотеке
–
это пример
platereader
.
Подключается функция из библиотеки следующим образом:
[
StructLayout
(
LayoutKind
.
Sequential
,
Pack
= 0)]
public
struct
ANPR_OPTIONS
{
public
byte
sign1
,
sign2
,
sign3
;
public
int
min_plate_size
;
public
int
max_plate_size
;
public
int
Detect_Mode
;
public
int
max_text_size
;
public
int
type_number
;
public
int
flags
;
public
IntPtr
custom
;
public
IntPtr
vers
;
public
double
alpha
;
public
double
beta
;
public
double
gamma
;
public
int
max_threads
;
};
#if
WIN32
[DllImport("iANPRinterface_vc1
2
_x86.dll", CallingConvention =
CallingConvention.StdCall)]
unsafe public static extern int anprPlateMemoryXML(byte[] in_buffer, int
size_buffer, ANPR_OPTIONS Options,
StringBuilder xml_buffer, int[] size_xml_buffer);
[DllImport("iANPR_vc1
2
_x86.dll", CallingC
onvention = CallingConvention.StdCall)]
unsafe public static extern void LicenseValue(sbyte[] key);
#elif
WIN64
[
DllImport
(
"iANPRinterface_vc1
2
_x64.dll"
,
CallingConvention
=
CallingConvention
.
StdCall
)]
unsafe
public
static
extern
int
anprPlateMemoryXML
(
byte
[]
in_buffer
,
int
size_buffer
,
ANPR_OPTIONS
Options
,
StringBuilder
xml_buffer
,
int
[]
size_xml_buffer
);
[
DllImport
(
"iANPR_vc1
2
_x64.dll"
,
CallingConvention
=
CallingConvention
.
StdCall
)]
unsafe
public
static
extern
void
LicenseValue
(
sbyte
[]
key
);
#endif
При этом в настройках проекта необходимо разрешить
небезопа
сный код
и задать символы условной компиляции
WIN
SR и
WIN64 для конфигураций сборки
x
86 и
x
64 соответственно.
40
В примереL файл читается
полностью в память и передается в
функцию библиотеки:
ANPR_OPTIONS
anpr;
anpr.Detect_Mode = 14;
anpr.min_plate_size = 500;
anpr.max_plate_size = 25000;
anpr.max_text_size = 20;
anpr.type_number = 0;
anpr.flags = 1;
anpr
.
sign1
= (
byte
)
'i'
;
anpr
.
sign2
= (
byte
)
'a'
;
anpr
.
sign3
= (
byte
)
'1'
;
anpr
.
vers
=
Marshal
.
AllocHGlobal
(4);
Marshal
.
WriteByte
(
anpr
.
vers
, (
byte
)
'1'
);
Marshal
.
WriteByte
(
anpr
.
vers
+ 1, (
byte
)
'.'
);
Marshal
.
WriteByte
(
anpr
.
vers
+ 2, (
byte
)
'6'
);
Marshal
.
WriteByte
(
anpr
.
vers
+ 3, 0);
anpr
.
alpha
= 90;
anpr
.
beta
= 90;
anpr
.
gamma
= 90;
anpr
.
max_threads
= 1;
StringBuilder
buffer_builder =
new
StringBuilder
(10000);
int
[] size_builder =
new
int
[1];
size_builder[0] =
10000;
int
result = anprPlateMemoryXML(buffer, size, anpr, buffer_builder, size_builder);
Чтобы узнать результат распознаванияL необходимо
просмотреть возвращенный XML:
StringBuilder
output =
new
StringBuilder
();
using
(
XmlReader
reader =
XmlReader
.Create(
new
StringReader
(buffer_builder.ToString())))
{
reader.ReadToFollowing(
"allnumbers"
);
reader.MoveToFirstAttribute();
string
numbers = reader.Value;
output.AppendLine(
"
Количество
найденных
номеров
: "
+ numbers);
int
all =
Convert
.ToInt32(numbers);
for
(
int
i = 0; i all; i++)
{
reader.ReadToFollowing(
"number"
);
reader.MoveToFirstAttribute();
string
num = reader.Value;
reader.MoveToNextAttribute();
string
num_coord = reader.Value;
output.AppendLine(
"
Номер
: "
+ num +
" (
Координаты
: "
+ num_coord +
")"
);
}
}
В результате в форму выведутся найденные номера и их
координаты:
41
4.1.1.
Пример
iA.0Rcapture_motion
на
C#
для
iA.0R SD+
Программа
iANPRcapture
_
motion
_
CShrp
предназначена для
демонстрации возможностей
iANPR
SDK
в вычислении траектории
движения автомобильного номера и детектирования пересечения
номером заранее заданных линийL т.е. для демонстрации
возможности реализации функционала детектирования въезда
-
выезда автомобилей с помощью
iANPR
SDK
. Эта программа написа
на
на языке
C
C и является аналогом программы
iANPRcapture
_
motion
,
написанной на языке С++. Эти и другие примеры использования
распространяются в составе
iANPR
SDK
.
Текущая версия
iANPRcapture
_
motion
_
CShrp
используется так:
iANPRcapture_motion_CShrp.exe 7
D:/video.avi
Где W
–
тип распознаваемого номера (российские номера)L
D
:/
video
.
avi
–
полное имя видео файла.
4.2.
Delphi
КонечноL в Delphi также можно использовать XML для
возвращения результатовL но здесь приведен примерL как вызвать
42
функции
из
демо
-
вер
сии
iANPR без XML
с использованием Delphi W
.
Для вызова функций из платной версии
iANPR
необходимо перед
первым использованием функций распознавания загрузить
лицензионный
ключ с
помощью функции
LicenseValue
или
LicenseCapture
для активации
iANPR
.
dll
или
iANPRcapture
.
dll
соответственно.
Определение
типов
:
type
ANPR_OPTIONS = Record
min_plate_size:integer;
max_plate_size:integer;
max_text_size:integer;
type_number:integer;
flags:integer;
end;
type
CvRect = Record
x:integer;
y:integer;
width:integer;
height:integer;
end;
type
PRect = ^CvRect;
Подключение функции:
function anprPlateMemoryRect(
in_buffer: PChar; size_buffer: integer; Rect: CvRect;
Options: ANPR_OPTIONS; AllNumber: PInt; Rects: PRect; Texts: PPChar ): integer;
stdcall; external '
iANPRinterface_vc12_x86.dll
'
name 'anprPlateMemoryRect';
Чтение из файла и вызов функции:
with TFile
Stream.create(File_, fmOpenReadWrite) do
try
GetMem(p, Size);
read(p^, Size);
s := Size;
finally
free;
end;
all := 100;
anpr.min_plate_size := 500;
anpr.max_plate_size := 25000;
anpr.Detect_Mode := 6; // ANPR_DETECTMODE2 | ANPR_DETECTMODE3;
anpr.max_text_size := 20;
anpr.type_number := 0; //
ANPR_RUSSIAN_BASE
anpr.flags := 0;
pr := @rect;
GetMem( ptext, all * sizeof(pchar));
for i := 0 to all
-
1 do
GetMem( ptext[i], 20 *sizeof( char ) );
RectArea.x := 0; RectArea.y := 0;
RectArea.wi
dth := 640; RectArea.height := 480;
r := anprPlateMemoryRect( p, s, RectArea, anpr, @all, pr, @ptext[0] );
43
FreeMem(p);
44
5. Рекомендации к использованию
ТРЕБОВАНИЯ К АЛГОРИТМУ РАСПОЗНАВАНИЯ
Номер автомобиля должен размещаться в кадре целиком.
Угол
вертикального наклона видеокамеры не более 40a.
Угол наклона вглубь
–
не более S0a.
Изображения должны быть четкими и не размытыми.
Размер символов для надежного распознавания должен быть не
менее 14 пикселей в высоту.
Расстояние до автомобиля камеры опред
еляется фокусным
расстояниемL установленным на камере и должно удовлетворять
требованиям к высоте символов и четкости изображения. Это может
быть и S метраL и W метров в зависимости от используемой камеры и
ее настроек.
СРАВНЕНИЕ ПРОИЗВОДИТЕЛЬНОСТИ ВЕРСИЙ
Компьютер:
Intel
Core
i
7
-
6700
K
4
ГГц
(на одном ядре)L
16
Гб ОЗУL
Windows
8.1
64
в режиме
ANPR_RUSSIAN_FULL
(библиотека
x
86)
Средняя обработка изображения 640x480: 0.0R
3
с (PRO)L 0.
4
c (FREE)
Средняя обработка изображения 19R0x1080: 0.
171
с (PRO)L
3
.
6
c
(FREE)
При внутреннем распараллеливании
1920x1080: 0.
098
с (PRO
)
РЕКОМЕНДАЦИИ К
ПАРАМЕТРАМ РАСПОЗНАВАНИЯ
1. Для систем автоматизации въезда на парковку по списку
белых номеров.
_
Mode
=
ANPR
_
;
flags
=
DEBUG
_
RECOGNITION
_
MODE
;
Для тогоL чтобы наблюдать максимальное количество номеровL
объединять результаты и потом
отсеивать по списку белых номеров.
Т.е. номер с одним ошибочно распознанным символом или вообще
нераспознанным Вы можете на основе совпадения остальных
символов с номером из белого списка (Вы сравниваете
самостоятельно) отнести к правильно распознанному
.
R. Для систем надежного распознавания номера при отсутствии
белого списка.
;
flags
=
NO_LOW_RELIABILITY
;
Для минимального количества ложных срабатываний.
45
6. Как пользоваться Демо
-
версиеи
iA.0R SD+
Демо
версия не предназначена для распознавания в реальном
времениL а лишь позволяет оценить функции распознавания
автомобильных номеров. Технология распознавания реа
лизована в
библиотеке iANPR_vc1
2
_x86.dll и существенно замедлена (примерно в
25
-
S5 раз в зависим
ости от режима распознавания и процессора
) для
ограничения использования. Проверить работу SDK можно по готовым
примерам. НапримерL image.exe.
image
0
image.bmp image.txt
После отработки в image.txt будут результаты работы алгоритма
распознавания (то же
самое достигается bat
-
файлом
run_read_image_bmp.bat
)
. Если вы хотите распознать группу файлов в
каталогеL то для этого можно воспользоваться bat
-
файлом
run_read_in_dir.bat. НапримерL так:
run_read_in_dir.bat c:
\
im
Результаты распознавания выведутся в кон
соль.
Для тестирования распознавания в потокеL что должно повышать
достоверность распознавания за счет анализа не одного кадраL а
последовательностиL нужно воспользоваться примером capture. По
умолчанию пример работает с подключенной к компьютеру камеройL
однако здесь следует помнитьL что поскольку скорость существенно
замедленаL то достоверность даже понизитсяL а не повысится.
Поэтому если вы хотите проверить реальную достоверность
распознаванияL то запишите сначала видео в файлL а потом вызовите
пример с
параметромL например так:
capture.exe
0
100media
\
AMBA2826.MOV
46
Заключение
Библиотека постоянно развивается и совершенствуетсяL в том
числе и с точки зрения качества распознавания.
Буд
е
т добавляться распознавание номеров из других стран.
Планируются
дополнительные модули с вспомогательными
функциями.
При возникновения ошибокL некорректного распознавания и т.п.
обращайтесь на [email protected] указав настройки алгоритмаL
которые вы используете
,
и приложив изображениеL с которым
возникают проблемы.