Розробка мобільного додатка для сканера візиток
Завдання виглядає просто: сфотографував візитку — отримав контакт у адресній книзі. На практиці між знімком та правильно заповненим CNContact — ланцюжок, у якому ломається все, що може сломатися: погане освітлення, нестандартні шрифти, двомовні візитки, вертикальна орієнтація тексту на японських карточках.
Розпізнавання тексту: Vision vs ML Kit vs хмара
На iOS перший вибір — Vision framework з VNRecognizeTextRequest. З iOS 16 точність розпізнавання зросла, підтримує 18 мов, працює повністю офлайн. Для більшості завдань достатньо.
let request = VNRecognizeTextRequest { request, error in
guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
let strings = observations.compactMap { $0.topCandidates(1).first?.string }
self.parseBusinessCard(lines: strings)
}
request.recognitionLevel = .accurate
request.usesLanguageCorrection = true
request.recognitionLanguages = ["ru-RU", "en-US"]
let handler = VNImageRequestHandler(cgImage: image, options: [:])
try? handler.perform([request])
На Android — ML Kit Text Recognition v2. Він підтримує латиницю, кирилицю, китайську, японську, корейську прямо з коробки без додаткового завантаження моделей. Важливий нюанс: TextRecognizer потрібно закривати через close() після використання, інакше — витік нативних ресурсів.
Коли потрібна максимальна точність або підтримка екзотичних шрифтів — підключаємо Google Cloud Vision API або AWS Textract. Хмарні варіанти дають структурований вихід з розділенням на блоки, рядки, слова з bounding box.
Розбір розпізнаного тексту у поля контакту
OCR дає масив рядків. Перетворити його на {ім'я: "Іванов Іван", телефон: "+7 999 123-45-67", email: "[email protected]", посада: "CTO"} — окреме завдання.
Регулярні вирази покривають телефони та email надійно. Імена та посади — складніше. Хороший підхід: NER (Named Entity Recognition) через CoreML-модель або легкий on-device NLP. Apple NaturalLanguage framework з NLTagger для визначення типу токенів (personalName, organizationName) працює непогано для англійської та російської.
Типова проблема: ім'я та посада стоять поруч без явних розділювачів. Контекст важливий — якщо рядок містить слово зі словника посад (CEO, директор, менеджер), вона, ймовірно, посада.
Для двомовних візиток (часто зустрічаються в B2B у СНД: російська на одній стороні, англійська на іншій) потрібно визначати мову кожного рядка окремо через NLLanguageRecognizer / LanguageIdentification з ML Kit та застосовувати відповідні правила розбору.
Якість захоплення зображення
Фінальна точність OCR прямо залежить від якості знімка. Кілька речей, які дійсно впливають:
-
Перспективна коррекція — візитку тримають під кутом, потрібно вирівнювати. На iOS
CIPerspectiveCorrection+VNDetectRectanglesRequestдля знаходження кордонів карточки. На Android —OpenCVабо ML KitObjectDetector. -
Покращення контрасту —
CIColorControlsз підвищеним контрастом та зниженням насиченості допомагає при сірому тексті на білому фоні. -
Автоматичний захоплення — детектувати карточку в кадрі через
VNDetectRectanglesRequestта робити знімок автоматично, коли карточка займає >60% кадру та стабільна 0.5 секунди. Ручний «натиснути кнопку» погіршує якість через дрижання рук.
Процес впровадження
Аудит: цільові мови візиток, потрібен ліле офлайн-режим, інтеграція з CRM або тільки з контактами пристрою.
Реалізація: захоплення з авто-детектом → коректування перспективи → OCR → розбір полів → ручне редагування перед збереженням (обов'язково — OCR помиляється).
Тестування: набір з 100+ реальних візиток різної якості та форматів.
Часові орієнтири
Сканер з Vision/ML Kit, базовим розбором та збереженням у контакти — 2–3 тижні. З хмарним OCR, NER, підтримкою кількох мов та інтеграцією з CRM — 5–7 тижнів.







