4.1.1. Пример iANPRcapture_motion на C# для iANPR SDK 4.2. Delphi 5. Рекомендации к использованию 6. Как пользоваться Демо-версией iANPR SDK Заключение.


Чтобы посмотреть этот 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 здесь:

&#x?xml;&#x ver;&#xsion;&#x="1.;�"?0;?xml version="1.0"?


oun;&#xtrie;&#xs va;&#xlue=;&#x"2"0;countries value="2"



country all_types="5" probability="
1.2
" comment="First
country
-

�Russia"


&#xtype;&#x val;&#xue=";"/0;type value="2"/


&#xtype;&#x val;&#xue=";"/0;type value="3"/


&#xtype;&#x val;&#xue=";"/0;type value="5"/


&#xtype;&#x val;&#xue=";"/0;type value="6"/


&#xtype;&#x val;&#xue=";"/0;type value="8"/


&#x/cou;&#xntry;/country



country all_types="1" probability="1" comment="Second
country
-

�Kazakhstan"


&#xtype;&#x val;&#xue=";Ă";&#x/000;type value="102"/


&#x/cou;&#xntry;/country


&#x/cou;&#xntri;s00;/countries


Флаги в структуре
iANPRCustom

предназначены для
дополнительных возможностей. На настоящий момент поддержан
только один флаг
FLAG_CUSTOM_MULTI_RESULT
L который
позволяет возвращать не один наиболее вероятный номерL а
обнаруженные вероятные номера не более S. Причем первый номер
наиболее

вероятен. Возвращаемые номера находятся в той же
текстовой строкеL поэтому ее необходимо сделать большего размера
(не менее 40 байт)L номера будут возвращены в следующем виде:

Номер 1
|
Номер R
|
Номер S

Для прописывание флага в
xml
L нужно изменить строку с
к
оличеством стран так:

oun;&#xtrie;&#xs va;&#xlue=;&#x"2" ;&#xmult;&#xi="1;&#x"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;&#xon_r;sul;&#xt ve;&#xrsio;&#xn='1;&#x.0'0;action_result version='1.0'

lln;&#xumbe;&#xrs v; lue;&#x='1';allnumbers value='1'

&#xnumb;r v; lue;&#x='M9;vMM;Ĵ';&#x coo;&#xrd=';Ƀ,;ɖ,;ŷ,;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&#x-6s6;&#xt-6d;i-6;&#xo6.-;h-6;

#include

Windows.h&#x-6W6;&#xi-6n;m-6;&#xo6w-;s-6;&#x.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 с которым
возникают проблемы.



Приложенные файлы

  • pdf 7696414
    Размер файла: 1 MB Загрузок: 0

Добавить комментарий