Text Recognition w aplikacjach — co to, OCR i Vision

Autor: IT Sectr Opublikowano: 2026-07-18 Czas czytania: 10 min

Text Recognition (OCR — Optical Character Recognition) — to technologia wyodrębniania drukowanego lub odręcznego tekstu z obrazów i strumienia wideo. W programowaniu mobilnym Text Recognition jest używany do digitalizacji dokumentów, rozpoznawania tablic rejestracyjnych, odczytywania wizytówek i tłumaczenia tekstu w czasie rzeczywistym. Główne mobilne rozwiązania OCR: ML Kit Text Recognition (Google), Vision Framework (Apple), Tesseract OCR (open-source). Według danych Google ML Kit, 2025, Text Recognition V2 przetwarza klatkę w 10–30 ms z dokładnością 96% dla alfabetu łacińskiego i 91% dla cyrylicy.

Najważniejsze

  • Text Recognition — wyodrębnianie tekstu z obrazów i wideo (OCR)
  • ML Kit Text Recognition — 45+ języków, dokładność 96% (alfabet łaciński), 10–30 ms
  • Apple Vision — VNRecognizeTextRequest, 13+ języków, natywny iOS
  • Tesseract — open-source OCR, 100+ języków, 50–200 ms, CPU
  • Real-time — do 30 FPS z CameraX/AVFoundation na nowoczesnych urządzeniach

Czym jest Text Recognition: zasady OCR

Text Recognition (OCR) — proces widzenia komputerowego, przekształcający obraz tekstu na znaki czytelne maszynowo. OCR składa się z etapów: wstępne przetwarzanie obrazu (binaryzacja, deskew, korekcja pochylenia), segmentacja (podział na wiersze, słowa, znaki), rozpoznawanie (klasyfikacja każdego znaku) i przetwarzanie końcowe (sprawdzanie ze słownikiem, korekcja błędów). Nowoczesne systemy OCR (ML Kit, Vision) wykorzystują sieci neuronowe end-to-end, łączące wszystkie etapy.

Typy OCR: tekst drukowany (printed text) — rozpoznawanie maszynowego tekstu z dokumentów, szyldów, ekranów — dokładność 95–99%; tekst odręczny (handwriting) — rozpoznawanie pisma ręcznego — dokładność 80–90% dla alfabetu łacińskiego, 70–80% dla cyrylicy; tekst kontekstowy (scene text) — tekst na naturalnych scenach: numery domów, znaki drogowe, nazwy sklepów — najtrudniejszy ze względu na zniekształcenia perspektywiczne i odblaski.

CRNN + CTC Loss — architektura stosowana w nowoczesnych modelach OCR. Convolutional Recurrent Neural Network (CNN + LSTM) wyodrębnia cechy obrazu, a Connectionist Temporal Classification dekoduje sekwencję znaków bez potrzeby wstępnej segmentacji. CRNN działa z tekstami dowolnej długości, jest odporny na pochylenia i zniekształcenia. Według arXiv (2025), modele CRNN osiągają 97.5% dokładności na benchmarku ICDAR 2019.

Rozwiązanie OCRDokładnośćSzybkośćJęzykiPlatforma
ML Kit V296%10–30 ms45+Android, iOS
Apple Vision95%10–40 ms13+iOS, macOS
Tesseract 590%50–200 ms100+Wieloplatformowe
Google Cloud Vision98%500–1000 ms200+Serwer (API)

CRNN dla urządzeń mobilnych — ML Kit wykorzystuje model MobileNetV2 + CRNN z kwantyzacją INT8. Model zajmuje 2–5 MB (latent) i jest wykonywany na GPU/NPU przez TFLite Delegate. W przeciwieństwie do Tesseract (klasyczny pipeline), sieciowy OCR nie wymaga osobnej segmentacji znaków i jest bardziej odporny na szumy. Wadą jest konieczność GPU lub NPU do pracy w czasie rzeczywistym — na czystym CPU prędkość spada do 5–10 FPS.

ML Kit Text Recognition na Android i iOS

ML Kit Text Recognition — główne narzędzie OCR dla aplikacji mobilnych. Dostępne w dwóch wersjach: V2 (Latin-based — zoptymalizowana dla alfabetu łacińskiego, cyrylicy, cyfr) i V1 (Latin + CJK — japoński, chiński, koreański, ale wolniejsza). V2 wykorzystuje model CRNN end-to-end, V1 — starszą CNN + LSTM. Google zaleca V2 we wszystkich przypadkach, z wyjątkiem potrzeby rozpoznawania CJK.

Struktura wyniku ML Kit: Text → TextBlock → Line → Element (Word/Symbol). Każdy poziom ma bounding box, confidence (0..1) i recognised text. Text — obiekt główny z fullText (cały rozpoznany tekst w jednym wierszu). TextBlock — logiczny blok tekstu (akapit, kolumna). Line — wiersz tekstu. Element — słowo lub symbol. Używaj confidence do filtrowania niedokładnych rozpoznań.

kotlin
// ML Kit Text Recognition V2
val recognizer = TextRecognition.getClient(
    TextRecognizerOptions.DEFAULT_OPTIONS
)

recognizer.process(inputImage)
    .addOnSuccessListener { text ->
        val fullText = text.text
        text.textBlocks.forEach { block ->
            val blockText = block.text
            val blockRect = block.boundingBox
            block.lines.forEach { line ->
                line.elements.forEach { element ->
                    val word = element.text
                    val confidence = element.confidence
                }
            }
        }
    }
    .addOnFailureListener { error -> /* error */ }

Text Recognition na iOS przez ML Kit: API analogiczne do Androida, ale używa UIImage/CVPixelBuffer zamiast InputImage. ML Kit automatycznie korzysta z Apple Neural Engine na A12+ przez Core ML Delegate. Dla iOS ML Kit Text Recognition V2 pokazuje szybkość 15–30 ms na iPhone 15 Pro. Dla maksymalnej wydajności konwertuj UIImage na CVPixelBuffer przed przekazaniem — zmniejsza to narzut konwersji.

Apple Vision Framework: VNRecognizeTextRequest

Apple Vision Framework udostępnia natywny OCR przez VNRecognizeTextRequest (iOS 13+). Vision OCR wykorzystuje Apple Neural Engine (ANE) i nie wymaga dodatkowych SDK. Obsługuje 13 języków (EN, FR, IT, DE, ES, PT, ZH, JP, KO, RU, AR, TH, VI). Vision automatycznie określa język tekstu (language correction) i obsługuje wiele języków w jednej klatce. Szybkość — 10–40 ms na A16+.

Cechy Vision OCR: recognitionLevel (fast vs accurate), automaticLanguageDetection, customWords (dodawanie specyficznych terminów), obsługa top candidates (wiele wariantów rozpoznania dla nieostrego tekstu). Tryb fast daje 90% dokładności przy 10–20 ms, accurate — 95% przy 30–50 ms. W produkcji używaj accurate z filtrowaniem po confidence >= 0.5.

swift
import Vision

let request = VNRecognizeTextRequest { request, error in
    guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
    for observation in observations {
        let topCandidate = observation.topCandidates(1).first
        let text = topCandidate?.string ?? ""
        let confidence = topCandidate?.confidence ?? 0
        let boundingBox = observation.boundingBox
    }
}
request.recognitionLevel = .accurate
request.usesLanguageCorrection = true

let handler = VNImageRequestHandler(cgImage: cgImage, orientation: .up)
try handler.perform([request])

Vision vs ML Kit na iOS: Vision jest szybszy na starszych urządzeniach (iPhone X–13) dzięki wbudowanemu ANE. ML Kit jest dokładniejszy na złożonych scenach (zniekształcenia, pochylenia, odblaski) dzięki modelowi Google wytrenowanemu na milionach obrazów scene text. Vision nie obsługuje confidence dla pojedynczych znaków (tylko dla słów), co ogranicza filtrowanie. Dla dokumentów — Vision (szybciej), dla scene text — ML Kit (dokładniej).

Tesseract OCR: alternatywa open-source

Tesseract OCR — open-source silnik rozpoznawania tekstu, opracowany przez HP (1985–1998) i rozwijany przez Google (2006+). Tesseract 5 (LSTM-based) wykorzystuje architekturę sieci neuronowej CRNN, co daje znaczący wzrost dokładności w porównaniu z Tesseract 4 (klasyczny + LSTM). Tesseract obsługuje 100+ języków, w tym cyrylicę, arabski, hebrajski i CJK. Dla Androida — tess-two (fork), dla iOS — swift-tesseract.

Wady Tesseract: szybkość 50–200 ms na klatkę (CPU-only, brak akceleracji GPU), wymaga wstępnego przetwarzania obrazu (binaryzacja, deskew, określenie orientacji) przed przekazaniem do silnika, brak wbudowanej detekcji tekstu — trzeba przekazać obszar obrazu (często w parze z OpenCV Text Detection lub EAST). Tesseract osiąga 90% dokładności na czystych dokumentach i ~70% na scene text.

Kiedy wybrać Tesseract: gdy aplikacja działa na urządzeniach bez Google Play (Huawei), potrzebna jest obsługa rzadkich języków (sanskryt, hebrajski) lub wymagana jest pełna personalizacja pipeline'u OCR (uczenie na własnych fontach). We wszystkich innych przypadkach ML Kit lub Vision są szybsze, dokładniejsze i wymagają mniej kodu. Tesseract to uzasadniony wybór tylko przy ograniczeniach dotyczących zewnętrznych SDK.

kotlin
// Tesseract OCR przez tess-two
val tess = TessBaseAPI()
tess.init(dataPath, "rus+eng")
tess.pageSegMode = TessBaseAPI.PageSegMode.PSM_AUTO

val bitmap = BitmapFactory.decodeResource(resources, R.drawable.text)
val gray = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
OpenCV.process(bitmap, gray) // Binaryzacja + deskew

tess.setImage(gray)
val result = tess.utF8Text
tess.recycle()

Wstępne przetwarzanie dla Tesseract jest obowiązkowe: konwersja do grayscale, binaryzacja (Otsu lub Adaptive), korekcja pochylenia (deskew), usuwanie szumów (median blur). Bez wstępnego przetwarzania dokładność Tesseract spada do 50–60%. Używaj OpenCV do przetwarzania: Imgproc.cvtColor → Imgproc.threshold → Imgproc.erode/dilate → Core.rotate (deskew). Dla dokumentów z równym tłem wystarczy binaryzacja, dla scene text — pełny pipeline.

Wstępne przetwarzanie obrazów dla OCR

Jakość obrazu — główny czynnik dokładności OCR. ML Kit i Vision mają wbudowane przetwarzanie wstępne, ale w skomplikowanych przypadkach (ciemne zdjęcia, rozmycie, prześwietlenia) dodatkowa obróbka zwiększa dokładność o 10–15%. Podstawowe techniki: zwiększenie kontrastu (CLAHE), usuwanie rozmycia (unsharp mask), korekcja perspektywy (perspective transform), usuwanie cieni i odblasków.

CLAHE (Contrast Limited Adaptive Histogram Equalization) — adaptacyjne wyrównanie histogramu, poprawiające kontrast lokalnych obszarów. CLAHE jest skuteczny dla zdjęć dokumentów z nierównomiernym oświetleniem (część w cieniu, część na świetle). OpenCV Core.createCLAHE z clipLimit=2.0 i tileGridSize=(8,8) daje optymalny wynik dla OCR. Po CLAHE dokładność ML Kit na ciemnych dokumentach wzrasta z 70% do 88%.

Korekcja perspektywy — obowiązkowa dla zdjęć dokumentów pod kątem. Używaj OpenCV findHomography + warpPerspective do wyrównania dokumentu. Do automatycznego wykrywania krawędzi dokumentu używaj Canny edge detection + findContours + approxPolyDP. Po korekcji perspektywy dokładność OCR wzrasta o 20–30% dla zdjęć pod kątem >30°.

kotlin
// CLAHE + preprocessing OpenCV
val mat = Mat()
Utils.bitmapToMat(bitmap, mat)
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY)

val clahe = Imgproc.createCLAHE(2.0, Size(8.0, 8.0))
clahe.apply(mat, mat)

Imgproc.GaussianBlur(mat, mat, Size(3.0, 3.0), 0.0)
Imgproc.threshold(mat, mat, 0.0, 255.0, Imgproc.THRESH_BINARY or Imgproc.THRESH_OTSU)

val processedBitmap = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888)
Utils.matToBitmap(mat, processedBitmap)

Detekcja tekstu przed OCR — dla scene text używaj EAST (Efficient Accurate Scene Text Detector) lub CRAFT (Character Region Awareness for Text Detection) przed przekazaniem do OCR. EAST wykrywa bounding box tekstu na scenie w 5–15 ms. CRAFT jest dokładniejszy (97%), ale wolniejszy (50–100 ms). Detekcja tekstu pozwala odciąć obszary bez tekstu i przekazywać do OCR tylko istotne fragmenty, co przyspiesza ogólne przetwarzanie.

Zastosowanie OCR w aplikacjach mobilnych

Skanowanie dokumentów — najczęstsze zastosowanie OCR. Aplikacje do skanowania (CamScanner, Adobe Scan, Google Drive) używają ML Kit lub Vision do rozpoznawania tekstu ze zdjęć dokumentów. Typowy pipeline: wykrywanie krawędzi dokumentu → korekcja perspektywy → obróbka CLAHE → OCR → formatowanie (PDF, DOCX). ML Kit Text Recognition V2 radzi sobie w 100–200 ms na stronę A4.

Tłumaczenie tekstu w czasie rzeczywistym — kombinacja OCR i tłumaczenia maszynowego. Google Translate, Microsoft Translator, Yandex Translate używają ML Kit lub Vision do rozpoznawania tekstu z kamery i nakładają tłumaczenie na oryginalny tekst (tłumaczenie AR). Wymaganie: latency < 200 ms dla komfortowego UX. ML Kit V2 + NNAPI daje 30–80 ms na klatkę, pozostawiając zapas na tłumaczenie i renderowanie.

Automatyczne wprowadzanie danych — OCR do wyodrębniania danych z wizytówek, kart bankowych, dokumentów tożsamości. ML Kit rozpoznaje tekst, następnie post-processing parsuje strukturę: imię, telefon, email (wizytówki) lub numer karty, termin, CVV (karty płatnicze). Dla wizytówek używaj wyrażeń regularnych po OCR. Dla kart bankowych — specjalistyczne modele ML (płatne, ~99% dokładności).

swift
// OCR + tłumaczenie AR (uproszczone)
let request = VNRecognizeTextRequest { req, _ in
    guard let results = req.results as? [VNRecognizedTextObservation] else { return }
    for observation in results {
        let text = observation.topCandidates(1).first?.string ?? ""
        let rect = observation.boundingBox
        // Tłumaczenie i renderowanie AR nad prostokątem
        DispatchQueue.main.async {
            overlayView.showTranslation(text, at: rect)
        }
    }
}
request.recognitionLevel = .fast
request.usesLanguageCorrection = false

OCR dla osób z ograniczeniami wzroku — Assistive Technology: aplikacje odczytują tekst z opakowań, menu, szyldów. Używają ML Kit OCR + Text-to-Speech (Android TTS / iOS AVSpeechSynthesizer). Kluczowe wymaganie — czas rzeczywisty z niskim opóźnieniem (< 100 ms). Seeing AI (Microsoft) i Envision AI stosują to podejście. Dla aplikacji accessibility używaj trybu fast recognition i nie filtruj po confidence — dla użytkownika ważny jest każdy tekst.

Często zadawane pytania

Czym jest Text Recognition (OCR) w aplikacjach mobilnych?

Text Recognition (OCR) — technologia, która pozwala aplikacji „czytać" tekst ze zdjęć i wideo. Kamera smartfona przechwytuje obraz, sieć neuronowa na urządzeniu rozpoznaje znaki i zwraca tekst czytelny maszynowo. W aplikacjach mobilnych OCR jest używane do skanowania dokumentów, tłumaczenia z kamery, wprowadzania danych z wizytówek i tworzenia dostępnych interfejsów dla osób z ograniczeniami wzroku.

Który OCR jest lepszy dla Androida: ML Kit czy Tesseract?

ML Kit Text Recognition — najlepszy wybór dla Androida: 96% dokładności, 10–30 ms szybkości, 45 języków, akceleracja GPU przez NNAPI, znajduje tekst o dowolnej orientacji. Tesseract — alternatywa open-source (90% dokładności, 100+ języków, CPU), odpowiednia dla urządzeń bez Google Play lub rzadkich języków. W 95% projektów wybieraj ML Kit — jest szybszy, dokładniejszy i nie wymaga wstępnego przetwarzania obrazu.

Czy do OCR na urządzeniu mobilnym wymagany jest internet?

Nie, ML Kit Text Recognition, Apple Vision i Tesseract działają w pełni on-device. ML Kit może pobrać model przy pierwszym uruchomieniu (downloaded mode), po czym działa offline. Apple Vision jest wbudowany w iOS, nie wymaga internetu. Tesseract jest całkowicie offline. Cloud OCR (Google Cloud Vision, AWS Textract) działają przez internet, ale nie są używane w mobilnych aplikacjach czasu rzeczywistego.

Jakie języki obsługuje ML Kit Text Recognition?

ML Kit Text Recognition V2 obsługuje 45+ języków grup łacińskiej i cyrylickiej: angielski, rosyjski, niemiecki, francuski, hiszpański, włoski, portugalski, polski, ukraiński, rumuński, turecki i inne. V1 (CJK) dodatkowo obsługuje chiński, japoński, koreański. Pełną listę znajdziesz w dokumentacji TextRecognizerOptions. Do rozpoznawania arabskiego lub hebrajskiego używaj Tesseract (>100 języków).

Jak poprawić dokładność OCR na zdjęciach dokumentów?

Podstawowe metody: wyrównanie dokumentu (perspective correction przez OpenCV), poprawa kontrastu (CLAHE), usuwanie rozmycia (unsharp mask), dobre oświetlenie (continuous auto-exposure), stabilizacja kamery (OIS/EIS). ML Kit sam radzi sobie z podstawowymi zniekształceniami, ale dla dokumentów ze zniekształceniami perspektywicznymi (>30°) wstępne przetwarzanie zwiększa dokładność o 20–30%. Używaj trybu fast recognition dla wideo.

Podsumowanie

  • Text Recognition — OCR na urządzeniach mobilnych: drukowany, odręczny, scene text
  • ML Kit V2 — 96% dokładności, 45+ języków, 10–30 ms, akceleracja GPU/NPU
  • Apple Vision — natywny iOS OCR (iOS 13+), 13 języków, przez ANE
  • Tesseract 5 — open-source, 100+ języków, 50–200 ms (CPU), fallback dla Huawei
  • Przetwarzanie wstępne — CLAHE, deskew, korekcja perspektywy zwiększają dokładność o 10–30%
  • Real-time — do 30 FPS przez CameraX/AVFoundation z ML Kit lub Vision
  • On-device — wszystkie obliczenia lokalnie, prywatność danych gwarantowana

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również