Мы, Smart Engines, продолжаем цикл статей про то, как встроить наши технологии распознавания (паспортов, банковских карт и других) в ваши приложения. Ранее мы уже писали про встраивание на iOS и Android, показывали, как встроить распознавание в Телеграм-бота, а сегодня мы расскажем про то, как работать с Python и PHP интерфейсами библиотеки распознавания Smart IDReader для использования на in-house сервере.
Кстати, список поддерживаемых нами языков программирования, помимо рассматриваемых здесь, включает C#, Objective-C, Swift и Java. Как и раньше, мы поддерживаем все популярные и многие непопулярные операционные системы и архитектуры, а наши бесплатные демонстрационные приложения доступны для скачивания из App Store и Google Play.
По традиции, демо-версия Smart IDReader SDK для Python и PHP вместе с примерами выложена на Github и доступна по ссылке.
Собираем обёртку
Поскольку версия подключаемого модуля должна совпадать с версией интерпретатора, мы поставляем не готовый модуль, а автосборщик, позволяющий собрать и развернуть на вашей машине необходимую обертку библиотеки распознавания Smart IDReader (поддерживаются Python 2/3 и PHP 5/7). Для этого необходимо запустить соответствующий сборочный скрипт, указав ему путь к нашей библиотеке libsmartidEngine.so и версию интерпретатора, под который нужно собрать модуль. К примеру, для Python это выглядит так:
bash build_python.sh ../../bin 3
PHP собирается похожим образом, только в качестве второго аргумента передается путь к используемому вами php-config:
bash build_php.sh ../../bin /usr/bin/php56-config
Важно: после сборки полученный модуль будет ссылаться на libSmartidEngine.so по абсолютному пути, так что вначале установите библиотеку в удобную вам директорию!
Автосборщик распакует поставляемый в сборке SWIG, сгенерирует модуль и проверит его, запустив тест.
Обёртка библиотеки включает в себя два файла — модуль, написанный на Python/PHP, и расширение для интерпретатора (_pySmartIdEngine.so для Python и phpSmartidEngine.so). Для интеграции распознавания в проект необходимо импортировать модуль и подключить расширение.
В случае с Python для этого достаточно явно прописать путь к модулю и расширению:
sys.path.append(os.path.join(sys.path[0], '../../bin/')) sys.path.append(os.path.join(sys.path[0], '../../bindings/')) import pySmartIdEngine
В PHP модуль импортируется так же:
require(“phpSmartIdEngine.php");
а вот с расширением немного сложнее — dynamic linking не работает в некоторых версиях, так что для постоянной работы с расширением его необходимо положить в папку, где лежат все расширения для вашей версии ( к примеру /usr/lib/php56/modules) и подключить, прописав в дефолтный php.ini
extension=phpSmartisEngine.so
В примере с GitHub мы просто указываем интерпретатору использовать наш php.ini с уже прописанным расширением
php56 -c php.ini smartid_sample.php
Итак, с подключением разобрались, смело идeм изучать пример!
Изучаем интерфейс
Пример запускается с тремя аргументами — путь к картинке, которую нужно распознать, путь к архиву с конфигурацией для движка и тип документа, который нужно распознать (тесты запускают пример для rus.passport.national (паспорт гражданина РФ))
python smartid_sample.py ../../testdata/passport_rf_2.jpg ../../data-zip/bundle_mock_smart_idreader.zip rus.passport.national
Как это работает:
# Создаём движок с указанием конфига (zip-архив, в в котором определяется набор поддерживаемых документов) engine = pySmartIdEngine.RecognitionEngine(config_path) # Задаём какие документы б��дем искать на картинке session_settings = engine.CreateSessionSettings() session_settings.SetEnabledDocumentTypes(document_types) # Создаём сессию распознавания session = engine.SpawnSession(session_settings) # Кормим ей картинку и перезапускаем сессию resultFromImageFile = session.ProcessImageFile(image_path) session.Reset() # Выводим результат output_recognition_result(resultFromImageFile)
Подробнее остановимся на способах загрузки изображения: это может быть путь к файлу, строка в Base64 и буфер в памяти (как данные в форматах RGB\YUV NV21, так и сам jpeg-файл). Буферы могут быть внешними, так же их можно достать из объекта класса Image (предварительно создав его, указав путь к файлу или с помощью всё того же буфера)
Важно: саму картинку в формате RGB или YUV можно достать только в Python-модуле c помощью bytearray-объекта (создаём объект нужного размера, передаём его в метод CopyToBuffer, см. пример), в PHP вы сможете работать только со строкой в формате Base64!
Целиком это выглядит так (в Python):
engine = pySmartIdEngine.RecognitionEngine(config_path) session_settings = engine.CreateSessionSettings() session_settings.SetEnabledDocumentTypes(document_types) # Создаём объект Image (позволяет работать с изображением) testImage = pySmartIdEngine.Image(image_path) # Создаём буффер в памяти, который можно отдать на распознавание binaryRGBfile = open(image_path, "rb") size = os.path.getsize(image_path) binaryRGBfileBuffer = bytearray(size) binaryRGBfile.readinto(binaryRGBfileBuffer) # тоже самое, только в формате Base64 f = open(os.path.join(sys.path[0],"base64.txt"), 'r') base64BufferString = f.readline() f.close() # Base64-строку можно получить и напрямую из объекта # base64BufferString = testImage.GetBase64String() # Создаём сессию распознавания session = engine.SpawnSession(session_settings) # Распознаём картинку resultFromImage = session.ProcessImage(testImage) session.Reset() resultFromImageFile = session.ProcessImageFile(image_path) session.Reset() resultFromImageData = session.ProcessImageData(binaryRGBfileBuffer, size) session.Reset() resultFromBase64 = session.ProcessImageDataBase64(base64BufferString) session.Reset() # Выводим результаты output_recognition_result(resultFromImage) output_recognition_result(resultFromImageFile) output_recognition_result(resultFromImageData) output_recognition_result(resultFromBase64)
Python и PHP модули позволяют воспользоваться всем функционалом, предоставляемым С++ интерфейсом нашей библиотеки (за исключением работы с буфером в PHP, о чём написано выше).
Заключение
Мы рассмотрели работу с SmartIdEngine SDK в Python и PHP, в примерах мы отразили все сложности, с которыми можно столкнуться в процессе развертывания модуля на рабочей машине. Mock-версия библиотеки, представленная на гитхабе, позволяет продемонстрировать механизм развертывания модуля и изучить их интерфейс, не ��еся в себе никакого функционала распознавания. Для получения триальной версии, обращайтесь к нам: support@smartengines.ru
