Реализация распознавания текста (OCR) в мобильном приложении
OCR на мобиле — одна из наиболее зрелых задач с хорошим набором готовых инструментов. Нативные решения (Vision на iOS, ML Kit на Android) закрывают большинство случаев. Сложности начинаются там, где текст нестандартный: рукопись, выцветший чек, отражения, искажённая перспектива.
Выбор инструмента
iOS Vision framework — VNRecognizeTextRequest. Работает полностью on-device, поддерживает 18+ языков, в том числе кириллицу. recognitionLevel = .accurate даёт лучшее качество, recognitionLevel = .fast — быстрее в 2–3 раза. На iPhone 12 при .accurate — 180–350 ms на A4-фото.
ML Kit Text Recognition v2 — кроссплатформенный (iOS + Android), on-device. Поддерживает латиницу, кириллицу, деванагари, CJK-символы. На Android через TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
Tesseract через SwiftyTesseract (iOS) или tess-two (Android) — когда нужна кастомная тренировка под специфический шрифт или язык. Медленнее нативных API в 3–5 раз, но гибче.
Для стандартных задач (документы, визитки, ценники) — Vision / ML Kit достаточно. Для специфических задач (медицинские бланки с нестандартными шрифтами) — Tesseract с дообученной моделью.
Preprocessing: от этого зависит 40% точности
VNRecognizeTextRequest и ML Kit принимают CGImage / InputImage — но качество входного изображения критично.
Типовой preprocessing pipeline:
- Конвертация в grayscale — снижает шум от цветовых артефактов JPEG
- Коррекция яркости/контраста через
CIColorControls(iOS) илиColorMatrix(Android) - Binarization (Otsu threshold) — помогает при неравномерном освещении
- Deskew — коррекция перспективы и наклона
Коррекция перспективы (документ снят под углом): на iOS VNDetectRectanglesRequest находит контур документа, CIPerspectiveCorrection выпрямляет. На Android — аналогично через Bitmap + Matrix.setPolyToPoly.
Кейс: приложение для сканирования накладных. ML Kit v2 без preprocessing давал 78% точность на полевых условиях (освещение склада, мятые листы). После Otsu binarization + perspective correction — 94%. Особенно помогло при распознавании номеров накладных с матричным шрифтом.
Real-time распознавание vs фото
Для реального времени (наводишь камеру, текст распознаётся на лету — как в Google Lens) нужна адаптация пайплайна:
- Снизить разрешение до 720p или меньше
- На iOS:
VNRecognizeTextRequestзапускаем вVNSequenceRequestHandlerкаждые 3–5 кадров, не на каждом - Буферизация результатов: показываем предыдущий результат, пока идёт инференс нового кадра
- Стабилизация текста между кадрами: сравниваем IoU bounding box-ов, если >0.7 — это тот же текст
На Android ML Kit в STREAM_MODE сам управляет частотой — не перегружает pipeline.
Постобработка: текст ≠ данные
Распознать текст и получить полезные данные — разные задачи.
Для номеров телефонов, email, дат — используем NSDataDetector (iOS) или Patterns (Android) поверх распознанного текста. Для структурированных документов (ИНН, СНИЛС, номер паспорта) — regex с проверкой контрольных цифр.
Для таблиц и форм: ML Kit v2 возвращает TextBlock → TextLine → TextElement с координатами каждого. Группируем по Y-координате строки (±5px) для реконструкции структуры таблицы.
Сроки
OCR для фото с preprocessing и постобработкой данных — 3–5 рабочих дней. Полноценный документ-сканер с real-time режимом, коррекцией перспективы и экспортом — 1–2 недели. Стоимость рассчитывается индивидуально.







