Специальная программа для малого и среднего бизнеса

Описание Smart Code Engine

Описание Smart Code Engine

Smart Code Engine — это многоплатформенный автономный SDK для распознавания линейных и двухмерных штрихкодов, МЧЗ, номеров банковских карт и телефонных номеров и других кодифицированных объектов.

Поддерживаемые операционные системы

Поддерживаются следующие операционные системы:

  • Windows;
  • Linux (включая РЕД ОС, OS ALT Linux, OS Astra Linux));
  • Mac OS;
  • ОС “Эльбрус”.
  • iOS;
  • Android;
  • OS Astra Linux;
  • ОС Аврора.

Жизненный цикл

Жизненный цикл CodeEngine состоит из следующих этапов:

  1. создание экземпляра CodeEngine, см. Создание экземпляра CodeEngine;
  2. настройка сессии распознавания:
  1. опционально: обратные вызовы, см. Обратные вызовы;
  2. создание объекта Image (изображения документа), см. Создание объекта изображения;
  3. обработка  изображения, см. Обработка  изображения документа;
  4. парсинг результата распознавания, см. Парсинг результата распознавания.

Создание экземпляра CodeEngine

Создайте экземпляр CodeEngine:

// C++
std::unique_ptr<se::code::CodeEngine> engine(
se::code::CodeEngine::CreateFromEmbeddedBundle());

// Java
import com.smartengines.code.*;
CodeEngine engine = CodeEngine.CreateFromEmbeddedBundle();

Параметры:

  • метод CreateFromEmbeddedBundle() — флаг “ленивой” конфигурации (true по умолчанию). Необязательный параметр.
    • если активирована “ленивая” конфигурация, некоторые внутренние структуры будут инициализироваться только по мере необходимости;
    • если “ленивая” конфигурация отключена, все внутренние структуры  и компоненты будут инициализироваться с помощью метода  Create().

ПОДСКАЗКА

Отключите “ленивую” конфигурацию в следующих случаях:
• при работе с серверными приложениями, для которых время отклика первого распознавания приоритетней общего потребления памяти;
• для измерения максимального объема памяти, используемой приложением

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

Сконфигурированный экземпляр объекта CodeEngine используется для инициализации сессий распознавания – создания экземпляров объекта CodeEngineSession, содержащего методы распознавания.

ВНИМАНИЕ!

CodeEngine::CreateFromEmbeddedBundle()  является фабричным методом и возвращает указатель на выделенный в памяти объект, который следует удалить

Настройка сессии распознавания

Создание объекта настроек сессии

Создайте объект CodeEngineSessionSettings на основе сконфигурированного экземпляра CodeEngine:

// C++
std::unique_ptr<se::code::CodeEngineSessionSettings> settings(
engine->GetDefaultSessionSettings());

// Java
import com.smartengines.code.*;
CodeEngineSessionSettings settings = engine.GetDefaultSessionSettings();

ВНИМАНИЕ!

CodeEngine::GetDefaultSessionSettings() является фабричным методом и возвращает указатель на выделенный в памяти объект, который следует удалить

Настройка движка распознавания

Настройте движок распознавания:

// C++
settings->SetOption("barcode.enabled", "true"); // Включение распознавания штрихкодов в текущей сессии

// Java
settings.SetOption("barcode.enabled", "true"); //  Включение распознавания штрихкодов в текущей сессии

Настройка дополнительных параметров сессии

Необязательный этап.

Задайте дополнительные параметры сессии:

// C++
settings->SetOption("barcode.COMMON.enabled", "true"); // Включение распознавания наиболее часто используемых символик штрихкодов в текущей сессии

// Java
settings.SetOption("barcode.COMMON.enabled", "true"); // Включение распознавания наиболее часто используемых символик штрихкодов в текущей сессии

Возможные параметры приведены в разделе Параметры сессии распознавания.

Инициализация сессии

При поставке продукта Smart Code Engine клиенту передается персональная подпись. Она содержится в файле README.html в директории /doc.

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

Это подтверждает право вызывающего на использование библиотеки и разблокирует ее.

Проверка подписи осуществляется в оффлайн режиме. Библиотека не обращается ни к каким внешним ресурсам.

Инициализируйте сессию (объект CodeEngineSession):

// C++
const char* signature = "... YOUR SIGNATURE HERE ..."; //Подпись, используемая для запуска Smart Code Engine
std::unique_ptr<se::code::CodeEngineSession> session(
engine->SpawnSession(*settings, signature, &my_workflow_feedback, &my_visualization_feedback));

// Java
import com.smartengines.code.*;
String signature = "... YOUR SIGNATURE HERE ..."; //Подпись, используемая для запуска Smart Code Engine
CodeEngineSession session = engine.SpawnSession(
settings, signature, my_workflow_feedback, my_visualization_feedback);

ВНИМАНИЕ!

CodeEngine::SpawnSession() является фабричным методом и возвращает указатель на выделенный в памяти объект, который следует удалить

Обратные вызовы

Можно настроить обратные вызовы. Для этого используйте подклассы  CodeEngineWorkflowFeedback и CodeEngineVisualizationFeedback:

// C++
class MyWorkflowFeedback : public se::code::CodeEngineWorkflowFeedback { /* callbacks */ };
class MyVisualizationFeedback : public se::code::CodeEngineVisualizationFeedback { /* callbacks */ };
// ...
MyWorkflowFeedback my_workflow_feedback;
MyVisualizationFeedback my_visualization_feedback;

// Java
import com.smartengines.code.*;
class MyWorkflowFeedback extends CodeEngineWorkflowFeedback { /* callbacks */ }
class MyVisualizationFeedback extends CodeEngineVisualizationFeedback { /* callbacks */ }
// ...
MyWorkflowFeedback my_workflow_feedback = new MyWorkflowFeedback();
> MyVisualizationFeedback my_visualization_feedback = new MyVisualizationFeedback();
CodeEngineSession session = engine.SpawnSession(
settings, signature, my_workflow_feedback, my_visualization_feedback);

Обратные вызовы подробно описаны в разделе Обработка обратной связи.

Создание объекта настроек обработки изображения

Создайте объект настроек обработки изображения (Image) для последующей обработки:

// C++
std::unique_ptr<se::common::Image> image(
se::common::Image::FromFile(image_path)); // Загрузка из файла

// Java
import com.smartengines.code.*;
Image image = Image.FromFile(image_path);

ВНИМАНИЕ!

Image::FromFile() является фабричным методом и возвращает указатель на выделенный в памяти объект, который следует удалить

Обработка изображения

Вызовите метод Process(…) для обработки изображения:

// C++
const se::code::CodeEngineResult& result = session->Process(*image);

// Java
import com.smartengines.code.*;
CodeEngineResult result = session.Process(image);

ВНИМАНИЕ!

CodeEngineResult::Process() не фабричный метод, но возвращаемый объект  result не является независимым. Срок его жизни не превышает срок жизни объекта session

Парсинг результата распознавания

При работе с видеопотоком обрабатывайте кадры последовательно в рамках одной и той же сессии. Время обработки не ограничено, но рекомендуется выполнять обработку до получения значения true параметра result.GetIsTerminal().

Значения текстовых полей объекта CodeEngineResult содержат информацию о результатах распознавания:

// C++
for (auto it_obj = result.ObjectsBegin(); it_obj != result.ObjectsEnd(); ++it_obj) {
const se::code::CodeObject& code_object = it_obj.GetValue();
std::string object_type = code_object.GetTypeStr(); // Тип объекта в формате строки 
bool is_accepted = code_object.IsAccepted(); // Получение значения флага is_accepted
for (auto it_field = code_object.FieldsBegin();
it_field != code_object.FieldsEnd(); ++it_field) {
const se::code::CodeField &code_field = it_field.GetValue();
std::string code_field_name = code_field.Name(); // Имя поля
if (code_field.HasOcrStringRepresentation())
std::string ocr_string = code_field.GetOcrString()
.GetFirstString()
.GetCStr(); // Получение результата распознавания поля в виде строки в кодировке UTF-8
}
}

// Java
import com.smartengines.code.*;
for (CodeObjectsMapIterator it_obj = result.ObjectsBegin();
!it_obj.Equals(result.ObjectsEnd()); it_obj.Advance()) {
CodeObject code_object = it_obj.GetValue();
String object_type = code_object.GetTypeStr(); // Тип объекта в формате строки 
boolean is_accepted = code_object.IsAccepted(); // Получение значения флага is_accepted

for (CodeFieldsMapIterator it_field = code_object.FieldsBegin();
!it_field.Equals(code_object.FieldsEnd()); it_field.Advance()) {
CodeField code_field = it_field.GetValue();
String code_field_name = code_field.Name(); // Имя поля
if (code_field.HasOcrStringRepresentation())
String ocr_string = code_field.GetOcrString().GetFirstString().GetCStr(); // Получение результата распознавания поля в виде строки в кодировке UTF-8
}

Описание SDK

Структура пакета поставки

Состав базового пакета поставки Smart Code Engine:

  • библиотека на языке C++;
  • обертка для C#/Java/Python/PHP;
  • исходный код обертки obj-C или/и React/Flutter для мобильных платформ;
  • автогенераторы для сборки оберток для продуктовой среды клиента (точная версия клиента на Python 3 или PHP. Рекомендуется использовать при возникновении проблем);
  • документация;
  • примеры.

Структура директорий:

Директория Содержимое Описание
secommon Файлы пространств имен C++ se::common namespace files Общие классы, например, Point, OcrString, Image, и т.д. См. Общие классы
Файлы интеграции, например, модуль,
Java com.smartengines.rumon (скомпилирован в один файл)
codeengine C++ se::code namespaces Основные классы — Main. См. Основные классы
Файлы интеграции, например, модуль Java com.smartengines.code module (скомпилирован в один файл)
doc Документация См. Документация
samples Полностью скомпилированный и готовый к использованию тестовый пример

Общие классы

Общие классы, например, Point, OcrString, Image и т.д., находятся в пространстве имен se::common в директории secommon.

Это следующие заголовочные файлы C++:

Заголовочный файл Описание
#include <secommon/se_export_defs.h> Содержит определения экспорта в библиотеках Smart Engines
#include <secommon/se_exceptions_defs.h> Содержит определения исключений в библиотеках Smart Engines
#include <secommon/se_geometry.h> Содержит классы и процедуры, описывающие геометрию (Point, Rectangle, и т.п.)
#include <secommon/se_image.h> Содержит классы и процедуры обработки изображений
#include <secommon/se_string.h> Содержит классы строк (MutableString, OcrString, и т.д.)
#include <secommon/se_string_iterator.h> Содержит определение итераторов строк
#include <secommon/se_serialization.h> Содержит вспомогательные классы, связанные с сериализацией объектов (не используется в Smart Code Engine)
#include <secommon/se_common.h> Вспомогательный заголовок, который включает в себя все вышеперечисленное.

Аналогичные Java API содержатся в модуле com.smartengines.rumon:

// Java
import com.smartengines.rumon.*; // Импорт классов пакета se::common classes

Основные классы

Основные классы (main) Code Engine содержатся в пространстве имен se::code в директории codeengine directory:

Заголовочный файл Описание
#include <codeengine/code_engine.h> Содержит класс  CodeEngine
#include <codeengine/code_engine_session.h> Содержит определение класса  CodeEngineSession
#include <codeengine/code_engine_session_settings.h> Содержит определение класса  CodeEngineSessionSettings
#include <codeengine/code_engine_result.h> Содержит определение класса  CodeEngineResult
#include <codeengine/code_engine_feedback.h> Содержит определение классов CodeEngineWorkflowFeedback и CodeEngineVisualizationFeedback и связанные с ними контейнеры
#include <codeengine/code_object_field.h> Содержит определение класса  CodeField
#include <codeengine/code_object.h> Содержит определение класса  CodeObject

Аналогичные классы Java API содержатся в модуле com.smartengines.code:

// Java
import com.smartengines.codeengine.*; // Импорт всех классов se::code

Документация

Все классы, методы, их параметры и значения параметров описаны в комментариях к коду, а также в справочном руководстве codeengine.pdf, содержащемся в папке с документацией.

Вся документация содержится в папке doc. Структура папки doc:

  • README.html — содержит краткое описание SDK Smart Code Engine;
  • best_practices.html — сод ержит рекомендации по использованию продукта;
  • codengine.pdf — содержит описание классов, методов и т.д.;
  • NOTICE.txt — содержит информацию об используемом стороннем программном обеспечении;
  • WHATSNEW.txt — содержит описание обновлений.

Обработка исключений

C++ API может выдавать исключения подклассов se::common::BaseException при неверном вводе данных, некорректных вызовах и других ошибках. Поддерживаются следующие подклассы исключений:

Исключение Описание
FileSystemException Выдается при попытке чтения из несуществующего файла или другой ошибке ввода-вывода, связанной с файловой системой
InternalException Выдается, если возникает неизвестная ошибка или ошибка возникает во внутренних компонентах системы.
InvalidArgumentException Выдается, если метод вызывается с недопустимыми входными параметрами
InvalidKeyException Выдается при попытке  доступа к ассоциативному контейнеру о с недействительным или несуществующим ключом или доступа к списку с недопустимым индексом или индексом, выходящим за пределы допустимого диапазона
InvalidStateException Выдается, если в системе возникает ошибка из-за неправильного внутреннего состояния системных объектов
MemoryException Выдается при попытке выделения объектов при недостаточном объеме оперативной памяти.
NotSupportedException Выдается при попытке доступа к методу, который с учетом текущего состояния или переданных аргументов не поддерживается в текущей версии библиотеки или не поддерживается вообще
Uninitialized Object Exception Выдается при попытке доступа к несуществующему или неинициализированному объекту

При возникновении исключений, выводятся сообщения, понятные пользователю, с помощью метода e.what().

Примечание

 se::common::BaseException не является подклассом std::exception.
Интерфейс Smart Code Engine не имеет зависимостей от STL

Оберткой для исключений Java API является общий класс java.lang.Exception. Тип исключения включен в текст сообщения.

При возникновении проблем, свяжитесь с нашей техподдержкой: sales@smartengines.ru or support@smartengines.ru.

Фабричные методы и управление памятью

Некоторые классы Smart Code Engine SDK содержат фабричные методы, возвращающие указатели на объекты, выделенные в куче.  Необходимо удалять такие объекты.

ПОДСКАЗКА

В C++:
Для простоты управления памятью и предотвращения ее утечек пользуйтесь умными указателями std::unique_ptr<T> или std::shared_ptr<T> .

В Java API:
Удаляйте ненужные объекты с помощью метода .delete()

Настройка распознавания штрихкодов

Движок распознает штрихкоды в определенном наборе кадров. По умолчанию эта функция отключена. Для ее включения, установите соответствующий параметр сессии:

// C++
settings->SetOption("barcode.enabled", "true");

// Java
settings.SetOption("barcode.enabled", "true");

ВНИМАНИЕ!

По умолчанию все символики штрихкодов исключены из процесса распознавания

Для включения символики в процесс распознавания, установите значения параметров:

// C++
settings->SetOption("barcode.<symbology>.enabled", "true");

// Java
settings.SetOption("barcode.<symbology>.enabled", "true");

Наборы поддерживаемых символик представлены в таблице:

Название Символики штрихкодов Описание
COMMON AZTEC | QR_CODE | DATA_MATRIX | PDF_417 | CODABAR | CODE_128 | EAN_8 | EAN_13_UPC_A | ITF | UPC_E | CODE_39 | CODE_93 Наиболее часто используемые символики. Могут подключаться по отдельности
ALL AZTEC | QR_CODE | MICRO_QR | RMQR | DATA_MATRIX | PDF_417 | MICRO_PDF_417 | CODABAR | CODE_128 | EAN_8 | EAN_13_UPC_A | ITF | UPC_E | CODE_39 | CODE_93 Все поддерживаемые символики. Могут подключаться по отдельности
ALL_1D CODABAR | CODE_128 | EAN_8 | EAN_13_UPC_A | ITF | UPC_E | CODE_39 | CODE_93 Одномерные штрихкоды. Могут подключаться по отдельности
ALL_2D AZTEC | QR_CODE | MICRO_QR | RMQR | DATA_MATRIX | PDF_417 | MICRO_PDF_417 Двумерные штрихкоды. Могут подключаться по отдельности

Для включения набора штрихкодов COMMON в процесс распознавания:

// C++
settings->SetOption("barcode.COMMON.enabled", "true");

// Java
settings.SetOption("barcode.COMMON.enabled", "true");

Для включения набора штрихкодов ALL в процесс распознавания:

// C++
settings->SetOption("barcode.ALL.enabled", "true");

// Java
settings->SetOption("barcode.ALL.enabled", "true");

ВНИМАНИЕ!

Рекомендуется включать в процесс распознавания только необходимые символики для достижения максимальной производительности и качества распознавания

Результат распознавания содержит два поля:

  • bytes — поле данных в формате base64;
  • value — поле данных в человекочитаемом формате или, если это невозможно, — копия данных поля bytes. Кодировка определяет тип формата данных, содержащихся в данном поле. Как правило, это значения utf8 или base64.

Существует три основных сценария распознавания штрихкодов:

  • focused штрихкоды обрабатываются с помощью портативной камеры в видеопотоке, когда штрихкод занимает значительную площадь исходного изображения;
  • anywhere штрихкоды обрабатываются на любом изображении в любом месте. Ресурсоемкая операция. Может применяться для обработки любого изображения из галереи. Рекомендуется использовать данный сценарий для распознавания изображений из галереи;
  • dummyв основном, используется, когда расположение штрихкода заранее определено.

ВНИМАНИЕ!

Для платежных штрихкодов рекомендуется установить параметры: включение символик QR, Aztec и DataMatrix в процесс распознавания, режим распознавания “focused”, max code =1 — ограничение максимально возможного количества распознаваемых штрихкодов единицей

Для включения необходимого режима установите соответствующий параметр сессии:

// C++
settings->SetOption("barcode.roiDetectionMode", "focused");

// Java
settings.SetOption("barcode.roiDetectionMode", "focused");

По умолчанию установлен “одиночный” режим подачи штрихкода — single: распознавание до первого найденного штрихкода.

Чтобы распознать несколько штрихкодов, установите “последовательный” режим — sequence.

// C++
settings->SetOption("barcode.feedMode", "sequence");

// Java
settings.SetOption("barcode.feedMode", "sequence");

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

Для включения пресета, задайте следующий параметр сессии:

// C++
settings->SetOption("barcode.preset", "AAMVA");

// Java
settings.SetOption("barcode.preset", "AAMVA");

Можно задать сложный пресет:

// C++
settings->SetOption("barcode.preset", "URL | PAYMENT");

// Java
settings.SetOption("barcode.preset", "URL | PAYMENT");

где значение параметра содержит набор пресетов, разделенных знаком | . Если пресет настроен корректно, к результату добавляется параметр CodeField message_type, содержащий название пресета, а также соответствующий список CodeFields.

Полный список поддерживаемых пресетов: AAMVA, GS1, URL, EMAIL, VCARD, ICALENDAR, PHONE, SMS, ISBN, WIFI, GEO, PAYMENT. Каждый пресет содержит определенный набор полей:

Пресет Поля
AAMVA В соответствие сл спецификацией AAMVA, например, «AAMVA_VERSION», «ANSI», «DAC» и др.
GS1 «BATCH/LOT», «EXPIRY», «GTIN», «SERIAL», «SSCC/SSCI» и др.
URL «URL»
EMAIL «Body», «Recipients», «Subject», «URL mailto», «Carbon copy» и др.
VCARD «vCard version», «ADR», «AGENT», «BDAY», «CATEGORIES», «CLASS», «LABEL», «EMAIL» и др.
ICALENDAR «EVENT0», «EVENT1» и др.
PHONE «Phone»
SMS «SMS_number», «Body»
ISBN «ISBN», «ISBN type», «Prefix», «Registration group»
WIFI «Authentication type», «Password», «SSID» и др.
GEO «Latitude», «Longitude», «Query»
PAYMENT «BIC», «BankName», «CorrespAcc», «Name», «PersonalAcc»и др.

Настройки распознавания штрихкодов представлены в таблице.

Параметр Тип возвращаемого значения Значе
ние по умолчанию
Описание
barcode.enabled «true» или «false» «false» Включает/отключает распознавание штрихкода
barcode.ALL.enabled «true» или «false» «false» Включает распознавание всех символик
barcode.COMMON.enabled «true» или «false» «false» Включает распознавание наиболее частых (common) символик
barcode.maxAllowedCodes целое число “1” Задает максимальное число распознаваемых кодов
barcode.roiDetectionMode «focused», «anywhere» или «dummy» “focused” Устанавливает режим ROI
barcode.feedMode «sequence»  или «single» “single” Устанавливает режим подачи штрихкодов
barcode.effortLevel «low», «normal»  или «high» “normal” Задает уровень усилий при распознавании
barcode.<symbology>.enabled «true» или «false» «false» Включает/исключает указанную символику
barcode.<symbology>.minMsgLen целое число “1” Минимальная длина сообщения со штрихкодом
barcode.<symbology>.maxMsgLen целое число “999” Максимальная длина сообщения со штрихкодом
barcode.<symbology>.checkSumPresence целое число “0” Задает наличие контрольной суммы (для 1d штрихкодов)
barcode.<symbology>.extendedMode «true» или «false» «false» Устанавливает расширенный режим распознавания (для 1d штрихкодов)
barcode.<symbology>.barcodeColour «black», «white»  или «unknown» «unknown» Задает цвет ожидаемого штрихкода
barcode.preset имя пресета __ Задает пресет для интерпретации содержимого декодированного штрих-кода
barcode.preset.PAYMENT.strictSpecCompliance «true» или «false» «false» Определяет, точно ли пресет PAYMENT соответствует спецификации
barcode.smartPaymentBarDecoding «true» или «false» «false» Включает умное распознавание кодировки для платежных штрих-кодов

Для включения умного распознавания кодировок платежных штрих-кодов, не соответствующих спецификации, установите параметры:

// C++
settings->SetOption("barcode.smartPaymentBarDecoding", "true");

// Java
settings.SetOption("barcode.smartPaymentBarDecoding", "true");

Будет создан объект CodeField smart_payment_bar_decoding_result, содержащий название кодировки. Этот объект можно использовать в пресете PAYMENT вместо спецификации. Полный список поддерживаемых кодировок: UTF8, CP1251, KOI8_R, ISO8859_5, CP932.

Настройка распознавания банковских карт

Движок bank_card распознает банковские карты в определенном наборе кадров. По умолчанию эта функция отключена. Чтобы ее включить, установите следующие значения параметров сессии:

// C++
settings->SetOption("bank_card.enabled", "true");

// Java
settings.SetOption("bank_card.enabled", "true");

Поддерживаются три типа банковских карт:

  • embossed — эмбоссированные, или карты с нанесением данных в виде рельефных знаков;
  • indent — гравированные, или карты с нанесением  данных в виде гравированных знаков;
  • freeform — напечатанные, или карты с плоским нанесением данных. Данные могут располагаться в различных частях карты.

По умолчанию активированы все типы. Можно явно включить распознавание банковских карт с помощью опций:

// C++
settings->SetOption("bank_card.embossed.enabled", "true");

// Java
settings.SetOption("bank_card.embossed.enabled", "true");

Результат распознавания эмбоссированных карт и гравированных карт может содержать следующие поля:

Поле Описание
number номер карты (обязательное поле)
name имя держателя карты
expiry_date срок действия в формате MM/ГГ (месяц/год)
optional_data_0 дополнительная строка любого формата
optional_data_1 дополнительная строка любого формата
optional_data_2 дополнительная строка любого формата

Результат распознавания напечатанных карт (freeform) может содержать следующие поля:

Поле Описание
number номер карты (обязательное поле)
name имя держателя карты
expiry_date срок действия в формате MM/ГГ (месяц/год)
iban IBAN (по ISO 13616)
secret code код VC/CVV

Режим захвата определяет, как искать банковскую карту.  Существуют два режима захвата:

  • mobile — подходит для распознавания с помощью портативных камер в видеопотоке;
  • anywhere — подходит для распознавания отсканированных, снятых на веб-камеру изображений, изображений и карт, размещенных произвольным образом. Рекомендуется применять для распознавания карт и изображений из галереи устройства

По умолчанию установлен режим mobile.

Опции распознавания банковских карт:

Параметр Тип возвращаемого значения Значе
ние по умолча
нию
Описание
bank_card.enabled «true» или «false» «false» Включает/отключает распознавание банковской карты
bank_card.captureMode «mobile» или «anywhere» «mobile» Устанавливает режим распознавания банковской карты
bank_card.enableStoppers «true» или «false» «true» Включает интеллектуальные ограничители текстовых полей (стопперы)
bank_card.extractBankCardImages «true» или «false» «false» Извлекает исправленное изображение банковской карты и сохраняет его в соответствующем объекте CodeObject

Настройка распознавание МЧЗ

Движок МЧЗ распознает машиночитаемые зоны на определенном наборе кадров согласно спецификации ICAO, см. здесь. По умолчанию эта функция отключена. Чтобы ее включить, задайте соответствующие опции сессии:

// C++
settings->SetOption("mrz.enabled", "true");

// Java
settings.SetOption("mrz.enabled", "true");

Результат распознавания содержится в поле объекта  full_mrz. Этот объект также содержит набор разделенных полей, имена которых зависят от типа МЧЗ.

Движок поддерживает распознавание следующих типов МЧЗ:

Тип МЧЗ  Документ Описание
подтип ICAO 9303 MRZ MRP (TD3) Машиночитаемый паспорт 2 строки по 44 символа
подтип ICAO 9303 MRZ MRVA Машиночитаемая виза Тип A, 2 строки по 44 символа
подтип ICAO 9303 MRZ MRVB Машиночитаемая виза Тип B, 2 строки по 36 символов
подтип ICAO 9303 MRZ TD1 Машиночитаемый проездной документ Тип 1, 3 строки по 30 символов
подтип ICAO 9303 MRZ TD2 Машиночитаемый проездной документ Type 2, 2 строки по 36 символов
МЧЗ-подобная зона Болгарские свидетельства о регистрации транспортного средства 3 строки по 30 символов
МЧЗ-подобная зона Водительские права Швейцарии 3 строки по 9 символов в первой строке, 30 символов во второй и третьей строках
МЧЗ-подобная зона Удостоверение личности Эквадора 3 строки по 30 символов
МЧЗ-подобная зона Удостоверение личности Франции 2 строки по 36 символов
МЧЗ-подобная зона Удостоверение личности Кении 3 строки по 30 символов
МЧЗ-подобная зона Российский внутренний паспорт 2 строки по 44 символа
МЧЗ-подобная зона Российская виза 2 строки по 44 символа

В зависимости от типа МЧЗ результат распознавания содержит подмножество полей со следующими названиями:

Название поля Описание
mrz_doc_type_code Код типа документа
mrz_number Номер документа
mrz_issuer Кем выдан
mrz_proprietor Владелец
mrz_vehicle_number Номер транспортного средства
mrz_line1 Строка 1
mrz_line2 Строка 2
mrz_line3 Строка 3
full_mrz МЧЗ полностью
mrz_vin VIN (Идентификационный номер транспортного средства)
mrz_id_number Идентификационный номер
mrz_cd_number Контрольное число номера
mrz_cd_bgrvrd_1 1-е контрольное число регистрационного сертификата транспортного средства Болгарии
mrz_cd_bgrvrd_2 2-е контрольное число регистрационного сертификата транспортного средства Болгарии
mrz_birth_date Дата рождения
mrz_name Имя
mrz_nationality Гражданство
mrz_opt_data_1 Персональный номер или другие дополнительные данные строки 1
mrz_opt_data_2 Персональный номер или другие дополнительные данные строки 2
mrz_last_name Фамилия
mrz_gender Пол
mrz_expiry_date Дата окончания срока действия
mrz_issue_date Дата выдачи
photo Фото
mrz_cd_birth_date Контрольное число даты рождения
mrz_cd_composite Составное контрольное число
mrz_cd_expiry_date Контрольное число даты окончания действия
mrz_cd_opt_data_2 Контрольное число строки 2 дополнительных данных
mrz_authority_code Код подразделения
mrz_id_visa ИД визы
mrz_invitation_number Номер приглашения
mrz_cd_name Контрольное число имени
mrz_cd_invitation_number Контрольное число номера приглашения
mrz_cd_id_visa Контрольное число ИД визы
mrz_first_name Имя
mrz_cd_issue_date Контрольное число даты вычета

Настройка распознавания строк кодированного текста

Движок code_text_line распознает строки кодированного текста, то есть строки с заранее заданным содержимым. По умолчанию эта функция отключена. Чтобы ее включить, задайте соответствующие опции сессии:

// C++
settings->SetOption("code_text_line.enabled", "true");

// Java
settings.SetOption("code_text_line.enabled", "true");

Существует два типа поддерживаемых кодированных текстовых строк: phone_number (номер телефона) и card_number (номер карты). По умолчанию оба типа не активированы.

ПРЕДУПРЕЖДЕНИЕ!

Типы phone_number и card_number являются взаимоисключающими

Укажите явно тип строки кодированного текста с помощью соответствующей опции сессии:

// C++
settings->SetOption("code_text_line.card_number.enabled", "true");

// Java
settings.SetOption("code_text_line.card_number.enabled", "true");

Движок code_text_line распознает как печатные, так и рукописные текстовые строки.

ВНИМАНИЕ!

Текстовая строка должна составлять не менее трети площади, занимаемой символами, обозначающими этот регион.
Поддерживаются номера в следующих форматах:
1) 11 цифр — номера, начинающиеся с 7 или 8, и кодами 3XX, 4XX, 7XX, 8XX, 9XX;
2) 10 цифр — номера, начинающиеся с 9 (сокращенная запись мобильных номеров)

Настройка распознавания платежных реквизитов

Движок payment_details распознает платежные реквизиты, представленные в текстовой форме, которые необходимы для осуществления платежа в финансовой системе Российской Федерации. По умолчанию эта функция отключена. Чтобы ее включить, задайте соответствующие опции сессии:

// C++
settings->SetOption("payment_details.enabled", "true");

// Java
settings.SetOption("payment_details.enabled", "true");

Для включения распознавания определенного типа платежных реквизитов,  задайте соответствующие опции сессии:

// C++
settings->SetOption("payment_details.<type>.enabled", "true");

// Java
settings.SetOption("payment_details.<type>.enabled", "true");

Полный список поддерживаемых типов: inn, kpp, rcbic, rus_bank_account, personal_account.

ВНИМАНИЕ!

По умолчанию включено распознавание всех типов платежных реквизитов

Технология Universal Pay, применяемая в Code Engine, позволяет распознавать объекты в платежном документе без указания типа.

Поддерживаемые объекты:

  • платежный штрихкод, выполненный по стандарту  ГОСТ Р 56042-2014: QR Code, Aztec Code, Data Matrix;
  • банковская карта;
  • номер телефона;
  • номер банковской карты.

Клиент предоставляет  на вход последовательность изображений, а сессия распознает и кладет в результат только те объекты, по которым можно произвести платеж (т.е. остальные двумерные штрихкоды не по ГОСТ будут игнорироваться).

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

Примеры настроек параметров Universal Pay:

// C++
settings->SetOption("global.workflow", "universalPay");
settings->SetOption("barcode.enabled", "true");
settings->SetOption("barcode.QR_CODE.enabled", "true");
settings->SetOption("barcode.AZTEC.enabled", "true");
settings->SetOption("barcode.DATA_MATRIX.enabled", "true");
settings->SetOption("barcode.preset", "PAYMENT");
settings->SetOption("barcode.feedMode", "sequence");
settings->SetOption("bank_card.enabled", "true");
settings->SetOption("code_text_line.enabled", "true");
settings->SetOption("code_text_line.phone_number.enabled", "true");
settings->SetOption("code_text_line.card_number.enabled", "true");

// Java
settings.SetOption("global.workflow", "universalPay");
settings.SetOption("barcode.enabled", "true");
settings.SetOption("barcode.QR_CODE.enabled", "true");
settings.SetOption("barcode.AZTEC.enabled", "true");
settings.SetOption("barcode.DATA_MATRIX.enabled", "true");
settings.SetOption("barcode.preset", "PAYMENT");
settings.SetOption("barcode.feedMode", "sequence");
settings.SetOption("bank_card.enabled", "true");
settings.SetOption("code_text_line.enabled", "true");
settings.SetOption("code_text_line.phone_number.enabled", "true");
settings.SetOption("code_text_line.card_number.enabled", "true");

Параметры сессии распознавания

Каждой сессии распознавания можно задать определенный набор параметров с помощью  методов класса CodeEngineSessionSettings.

Для получения имен параметров и их значений, выполните следующую процедуру:

// C++
for (auto it = settings->Begin(); it != settings->End(); ++it) {
// it.GetKey() возвращает имя параметра
// it.GetValue() возвращает значение параметра
}

// Java
for (StringsMapIterator it = settings.Begin();
!it.Equals(settings.OptionsEnd());
it.Advance()) {
// it.GetKey() возвращает имя параметра
// it.GetValue() возвращает значение параметра
}

Для изменения значений параметров, воспользуйтесь методом SetOption(…):

// C++
settings->SetOption("barcode.enabled", "true");
settings->SetOption("barcode.COMMON.enabled", "true");

// Java
settings.SetOption("barcode.enabled", "true");
settings.SetOption("barcode.COMMON.enabled", "true");

Значения параметров всегда представлены строкой (string). При необходимости передать целочисленное (integer) или булевое (bool) значение, преобразите их в строку.

Глобальные параметры:

Параметр Тип возвращаемого значения Значе
ние по умолчанию
Описание
global.enableMultiThreading «true» или «false» «true» Обеспечивает параллельное выполнение внутренних алгоритмов
global.rgbPixelFormat Строка символов R, G, B, и A “RGB” для 3-канальных изображений, “BGRA” for 4-канальных изображений Последовательность цветовых каналов в методе session.ProcessSnapshot()
global.sessionTimeout Double “0.0” для серверных бандлов, “5.0” для мобильных бандлов Таймаут сессии в секундах

Обработка обратной связи

Smart Code Engine SDK поддерживает дополнительные обратные вызовы во время анализа документов (до завершения их обработки) — метода Process(…). Это позволяет пользователю получать больше информации о процессе распознавания, а также помогает создавать интерактивный графический интерфейс.

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

// C++
class MyWorkflowFeedback : public se::code::CodeEngineWorkflowFeedback {
public:
virtual ~OptionalWorkflowFeedBack() override = default;

public:
virtual void ResultReceived(const se::code::CodeEngineResult& result) override { }
virtual void SessionEnded() override { }
};

class MyVisualizationFeedback : public se::code::CodeEngineVisualizationFeedback {
public:
virtual ~OptionalVisualizationFeedBack() override = default;

public:
virtual void FeedbackReceived(
const se::code::CodeEngineFeedbackContainer& /*feedback_container*/) override { }
};

// Java
import com.smartengines.code.*
class MyWorkflowFeedback extends CodeEngineWorkflowFeedback {
public void ResultReceived(CodeEngineResult result) { }
public void SessionEnded() { }
}

class MyVisualizationFeedback extends CodeEngineVisualizationFeedback {
public void FeedbackReceived(CodeEngineFeedbackContainer feedback_container) { }
}

Создайте экземпляры классов MyWorkflowFeedback и MyVisualizationFeedback и передайте их в качестве параметров при инициализации сессии:

// C++
MyWorkflowFeedback my_workflow_feedback;
MyVisualizationFeedback my_visualization_feedback;
std::unique_ptr<se::code::CodeEngineSession> session(
engine->SpawnSession(*settings, signature, &my_workflow_feedback, &my_visualization_feedback));

// Java
import com.smartengines.code.*;
MyWorkflowFeedback my_workflow_feedback = new MyWorkflowFeedback();
MyVisualizationFeedback my_visualization_feedback = new MyVisualizationFeedback();
CodeEngineSession session = engine.SpawnSession(settings, signature, my_workflow_feedback, 
my_visualization_feedback);

ВНИМАНИЕ!

Не удаляйте экземпляры подкласса CodeEngineWorkflowFeedback и CodeEngineVisualizationFeedback во время жизни сессии CodeEngineSession. Рекомендуется поместить их в одну область видимости

Особенности Java API

Smart Code Engine SDK включает в себя Java API, автоматически генерируемый из интерфейса C++ с помощью инструмента SWIG.

Интерфейс Java почти идентичен C++.

Освобождение объекта

Несмотря на то, что сборка мусора присутствует и работает, рекомендуется вызывать метод obj.delete() для наших объектов API вручную, поскольку они являются обертками памяти, выделенной в куче. Размер их кучи неизвестен сборщику мусора, что может привести к задержке удаления объектов и, следовательно, высокому общему потреблению памяти.

CodeEngine engine = CodeEngine.CreateFromEmbeddedBundle(true); // или любой другой объект

// ...
engine.delete(); // гарантирует принудительное и немедленное освобождение обернутого объекта C++

Область видимости объектов обратной связи

ВНИМАНИЕ!

При использовании вспомогательного объекта обратной связи с помощью подклассов CodeEngineWorkflowFeedback или CodeEngineVisualizationFeedback убедитесь, что его экземпляр имеет ту же область видимости, что и CodeEngineSession. Причина этого в том, что наш API не содержит указатель на экземпляр объекта обратной связи. В результате, сборка мусора выполняется преждевременно, что приводит к сбою.

// Java
// Недостаток: может повлечь преждевременное удаление сборщиком мусора экземпляра объекта обратной связи (feedback)
class MyRecognizer {
private CodeEngine engine;
private CodeEngineSession session;
private void InitializeSmartCodeEngine() {
// ...
session = engine.SpawnSession(settings, signature, new MyWorkflowFeedback(), new MyVisualizationFeedback());
// объект обратной связи (feedback) мoжет быть удален сборщиком мусора, т.к. объект - вне сессии
}

}

// Java
// Преимущество: доступ к сессии распознавания
class MyRecognizer {
private CodeEngine engine;
private CodeEngineSession session;
private MyWorkflowFeedback workflow_feedback; //
private MyVisualizationFeedback visualization_feedback; // feedbacks has session's scope
private void InitializeSmartCodeEngine() {
// ...
workflow_feedback = new MyWorkflowFeedback();
visualization_feedback = new MyVisualizationFeedback(); session = engine.SpawnSession(settings, signature, workflow_feedback, visualization_feedback);
} }

Часто задаваемые вопросы

  • Как протестировать систему?

    Можно скачать демо-версию в RuStore

  • Какой пример использовать?

    Пользуйтесь примером из папки codeengine_sample*.

  • Как установить и протестировать вашу библиотеку?

    Мы предлагаем библиотеку в виде классического SDK и примеры интеграции. Установите один из наших примеров (они находятся в папке /samples).

  • Какие форматы файлов поддерживаются?

    Поддерживаются форматы:

    •  jpeg, tiff (кроме TIFF_ZIP и TIFF_JPEG), png, bmp;
    • base64 (форматы из пункта выше);
    • файловый буфер с предварительным указанием цветовой схемы, ширины\высоты\страйда\количества каналов.
    • Что делать, если необходимо распознать изображение в формате PDF?

      PDF мы не поддерживаем и рекомендуем растеризовать его (привести в поддерживаемый формат) на своей стороне перед распознаванием.

    • Как обновить систему до новой версии?

      Замените библиотеки в папке /bin и обертки (в папке /bindings). Все это содержится в поставляемом SDK.

    • У меня есть версия SDK для Windows, но предстоит работать на ОС семейства Linux. Как запустить docker контейнер для Linux?

      Наш SDK зависит от платформы. Свяжитесь с нами по почте  sales@smartengines.ru or support@smartengines.ru, и мы передадим подходящий SDK.

    • У меня есть версия SDK для Centos 7. При попытке запустить ее Ubuntu/Debian/Alpine, появляется много ошибок «undefined symbol».

      Не рекомендуется использовать SDK на несовместимых ОС. Свяжитесь с нами по почте sales@smartengines.ru or support@smartengines.ru, и мы передадим подходящий SDK.

    Распространенные ошибки

    1. Failed to verify static auth (Не удалось проверить сигнатуру).

      Возможно, введена невалидная подпись.

    2. Failed to initialize CodeEngine: no single engine was provided (Не найдены движки, поддерживающие типы документов, заданные в настройках).

      Ни один движок не включен в настройках или ни один из включенных движков не содержится в бандле (например, если в бандле присутствуют только штрихкоды, а пользователь пытается включить банковские карты).

    3. Failed to initialize CodeEngine: mismatching engine version in config: (Не удалось инициализировать CodeEngine: несоответствующая версия движка в конфигурации).

      Нельзя использовать файл конфигурации версии, отличной от версии библиотеки. Они должны быть из одного SDK.

    4. Libcodeengine.so:cannot open shared object file:no such file or directory (не удается открыть файл общего объекта: нет такого файла или каталога).

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

    5. for PYTHON and PHPlibpython3.x.x:cannot open shared object file: No such file or directory (не удается открыть файл общего объекта: нет такого файла или каталога для PYTHON и PHPlibpython3.x.x)

      Такого файла или каталога нет: модуль, который вы используете, создан для другой версии python, /samples/codeengine_sample_*/ содержит скрипт для сборки модуля на вашей стороне. Не забудьте, что у вас должны быть установлены пакеты разработки для вашего языка.

    Smart Code Engine: лучшие практики

    Распознавание на мобильных устройствах

    1. Если вы точно знаете, какой документ должен сканировать пользователь, нарисуйте рамку поверх экрана сканирования в пользовательском интерфейсе. Это помогает пользователю совместить документ с камерой, что может ускорить процесс распознавания.
    2. В мобильных SDK мы рекомендуем размещать кнопку «Сканировать» на экране с превью камеры. Это позволит пользователю лучше выровнять документ, дождаться фокусировки и инициализации движка прежде, чем начать распознавание. Этот трюк позволяет ускорить процесс захвата, так как движок будет обрабатывать меньше пустых начальных кадров.
    3. Судить о качестве распознавания мы рекомендуем по атрибуту полей IsAccepted.
    4. Инициализируйте движок распознавания асинхронно перед тем, как сделать доступной кнопку сканирования документов. Пользователю не придется ждать инициализации движка, когда придет время сканировать документ.
    5. Не храните свою персонализированную подпись в читаемом виде (т.е. в ресурсах), всегда храните ее либо закодированной в бинарном файле приложения, либо подгружайте удаленно.
    6. Для номеров телефонов и номеров банковских карт (не путать с распознаванием банковских карт) необходимо изображение с пропорциями 2:1. Например, если ширина изображения 500px, то его высота должна быть около 250px. Это ограничение связано с тем, что в этих пропорциях искомый объект занимает максимальную площадь на изображении. Именно на этот сценарий обучена наша поисковая сеть.

    Распознавание на сервере

    1. Инициализация механизма распознавания может занять значительное время, но помните, что механизм распознавания является постоянным. Этот механизм можно инициализировать только один раз, после чего из одного и того же механизма можно запустить несколько сеансов распознавания. Сессии могут создаваться параллельно, и они никак не будут влиять друг на друга.
    2. Чтобы получить максимальную отдачу от нашего SDK, обратитесь к справочному руководству по основному интерфейсу библиотеки C++.
    3. Можно отключить внутреннюю многопоточность механизма распознавания, а также отключить “ленивую” инициализацию, заставляя механизм загружать и инициализировать все ресурсы одновременно.
    4. Если вы загружаете изображения из файла, убедитесь, что загружаемые файлы размещены на высокопроизводительном дисковом устройстве: на некоторых устройствах время, необходимое для загрузки изображения из файла, может быть больше, чем само распознавание.
    5. Избегайте предварительной обработки входных изображений: наши продукты лучше всего работают с изображениями, полученными непосредственно с устройства захвата (камеры или сканера).

Заказать продукт

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

    Тинькофф Банк

    Smart Engines поставляет мобильные и серверные решения по распознаванию документов Тинькофф Банку

    Альфа-Банк

    Альфа-Банк распознает документы клиентов в мобильном приложении с помощью Smart ID Engine

    ВТБ

    ВТБ перешел на российские технологии для распознавания QR-кодов и банковских карт

    Газпромбанк

    Газпромбанк внедрил решение Smart Engines на основе искусственного интеллекта для распознавания QR-кодов

    Заказать продукт

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

      Array ( )