Smart IDReader SDK — как добавить распознавание в iOS приложение за 5 минут — теперь и на Github

  • Tutorial

Ранее мы, Smart Engines, уже писали про наши технологии распознавания (паспорта РФ, банковских карт и многих других). Основной ценностью SDK является "ядро" или "движок" распознавания Smart IDReader, который объединяет функциональность сканирования всего, что мы умеем сканировать, под единым интерфейсом.


Библиотека распознавания написана на С++ для достижения максимальной производительности, но для использования с различными языками программирования у нас есть версии интерфейсов библиотеки на C++, C, C#, Objective-C, Java и даже Visual Basic. Мы поддерживаем все популярные операционные системы: iOS, Android, Windows, Linux, MacOS, Solaris и, разумеется, Эльбрус и AstraLinux. Наши алгоритмы оптимизированы под такие архитектуры, как ARMv7-v8, AArch64, x86, x86_64, SPARC, E2K.


Мы решили выложить демо-версию нашего SDK на Github, чтобы вы могли ознакомиться с интерфейсом библиотеки (как Objective-C часть, так и C++), почитать документацию и попробовать встроить Smart IDReader в ваше приложение. Репозиторий с демо-версией Smart IDReader iOS SDK доступен по ссылке: https://github.com/SmartEngines/SmartIDReader-iOS-SDK


Чтобы посмотреть, как Smart IDReader выглядит в нашем исполнении после встраивания, вы можете скачать бесплатные полные версии приложений из App Store и Google Play.


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


Что находится в SDK


Структура iOS SDK, которую получает заказчик и которую можно увидеть в репозитории, такая:


  • doc — документация
  • SESmartID — код Objective-C GUI обертки над С++ ядром, с которым и происходит взаимодействие
  • SESmartIDCore/data-zip — конфигурация ядра
  • SESmartIDCore/include — C++ заголовочные файлы
  • SESmartIDCore/lib — универсальная статическая библиотека для iOS-устройств и Simulator-ов
  • SESmartIDSample и SESmartIDSample.xcodeproj — файлы sample-проекта

Весь iOS-код нашего SDK, включающий в себя как код основного ViewController-а, так и код примера его использования, поставляется в исходном виде, а не в виде скомпилированной библиотеки. Вы можете использовать и менять его как захотите.


Настройка Xcode проекта


Для добавления нашего SDK в ваш проект требуется сделать следующие действия:


  1. Перетащить папку SESmartID с кодом обертки из SDK в проект, при добавлении выбрать Create Groups
  2. Сделать то же самое для папки lib со статической библиотекой (находящейся внутри SESmartIDCore)
  3. Перетащить папку data-zip с конфигурацией, при добавлении выбрать Create Folder References
  4. Добавить папку include в Header Search Paths проекта

Готово! Структура вашего проекта по окончании может выглядеть так:




Взаимодействие с ядром распознавания


Основной класс обертки, с которым вы взаимодействуете, называется SESIDViewController. Чтобы получать результаты распознавания нужно также добавить в ваш класс протокол SESIDViewControllerDelegate и сам объект обертки следующим образом:


#import "SESIDViewController.h"

@interface SESIDSampleViewController : UIViewController <SESIDViewControllerDelegate>
@property (nonatomic, strong) SESIDViewController *smartIdViewController;
@end

Затем, ядро распознавания необходимо сконфигурировать:


- (void) initializeSmartIdViewController {
  // Создаем ядро/экран распознавания
  self.smartIdViewController = [[SESIDViewController alloc] init];

  // Проставляем делегат, через который к нам придет результат распознавания
  self.smartIdViewController.delegate = self;
}

Наконец, когда вы хотите отсканировать документ, нужно показать экран распознавания, указав, какие документы требуется распознавать в рамках текущей сессии:


- (void) showSmartIdViewController {
  // Указываем, какие документы мы хотим распознавать
  // Документация содержит подробное описание возможных типов документов и т.п.
  [self.smartIdViewController addEnabledDocumentTypesMask:"rus.passport.*"];
  //  [self.smartIdViewController addEnabledDocumentTypesMask:"mrz.*"];
  //  [self.smartIdViewController addEnabledDocumentTypesMask:"card.*"];

  // Можно контролировать таймаут в секундах, после которого распознавание закончится
  self.smartIdViewController.sessionTimeout = 5.0f;

  // Показываем экран распознавания
  [self presentViewController:self.smartIdViewController
                     animated:YES
                   completion:nil];
}

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


// Вызывается после распознавания очередного кадра видеопотока
- (void) smartIdViewControllerDidRecognizeResult:(const se::smartid::RecognitionResult &)result {
  // Флаг "терминальности" проставляется, когда движок полностью уверен в результате или когда истек таймаут
  if (!result.IsTerminal()) {
    // Здесь можно показать промежуточный результат на экране или ничего не делать 
    return;
  }

  // Закрываем экран распознавания
  [self dismissViewControllerAnimated:YES completion:nil];

  // Используем результат распознавания

  // Можно получить названия всех присутствующих строковых полей
  const std::vector<std::string> &stringFieldNames = result.GetStringFieldNames();

  // Или взять интересующее строковое поле
  const se::smartid::StringField &field = result.GetStringField("second_name");
  // Проверить, уверен ли движок в результате
  const BOOL fieldAccepted = field.IsAccepted();
  // И взять его содержимое
  NSString *fieldValue = [NSString stringWithUTF8String:field.GetUtf8Value().c_str()];

  // То же самое можно сделать для изображений: фотографии и других
  if (result.HasImageField("photo")) {
    const se::smartid::Image &image = result.GetImageField("photo").GetValue();
    self.resultImageView.image = [SESIDViewController uiImageFromSmartIdImage:image];
  }
}

// Вызывается при отмене сканирования пользователем
- (void) smartIdViewControllerDidCancel {
  // Закрываем экран распознавания
  [self dismissViewControllerAnimated:YES completion:nil];
}

Заключение


Мы рассказали, как встроить Smart IDReader SDK в ваше iOS приложение.


Кстати, если запустите пример с Github и увидите незнакомую женщину, не пугайтесь! Это — широко известная в узких кругах разработчиков систем распознавания Erika Mustermann, популярность которой сопоставима с популярностью знаменитой Лены из статей по обработке изображений.

Smart Engines
47.13
Обработка изображений, распознавание в видеопотоке
Share post

Comments 4

    0
    Я не нашел в статье самого важного — описание лицензии и цены. На вашем сайте цена тоже где то спрятана.
      0
      Мы предоставляем различные варианты лицензий и ценовых политик в зависимости от ваших предпочтений. Пожалуйста, напишите нам на sales@smartengines.biz или позвоните по телефону +7 (495) 649 82 60 — мы будем рады проконсультировать вас по любым вопросам, связанным с нашими продуктами.
      0

      Сколько ваша библиотека добавляет к размеру приложения?

        0
        Размер бинарного файла нашего sample-приложения внутри .app архива для одной архитектуры растет до примерно 7 мегабайт после линковки к статической библиотеке ядра распознавания. Кроме того, каждый новый документ добавляет около 1 мегабайта конфигураций. В следующей версии мы планируем еще сильнее уменьшить размер конфигурации для случая большого количества документов.

      Only users with full accounts can post comments. Log in, please.